Importazione inderogabile di moduli con Python

0

Sto sviluppando un modulo che dovrebbe essere in grado di interagire con altri moduli come numpy o PIL. Per accettare parametri e testare se, per esempio, un parametro è un numpy.ndarray , dovrei prima importare numpy.

Quello che facevo nei progetti precedenti è

numpy_exists = True
try:
    import numpy as np
except:
    numpy_exists = False

Quindi, accettando i parametri che potrebbe essere di tipo <type numpy.ndarray> l'ho controllato in questo modo:

    if numpy_exists and type(param) == np.ndarray:
        # ...

Ora funziona, ma si sente molto debole perché (personalmente) guardo la dichiarazione e l'unica cosa che vedo è il NameError che questo codice potrebbe generare. Certo, non genera l'errore, ma un codice del genere mi fa sentire in imbarazzo quando lo guardo.

Questo è un buon modo per gestire il problema? C'è uno migliore?

    
posta Yotam Salmon 09.03.2018 - 23:17
fonte

1 risposta

2

Penso che questo sia generalmente soddisfacente. Ma dal punto di vista del design, probabilmente lo risolveremo spostando il controllo di tipo per i parametri nella mia funzione (o persino in un decoratore, che sembra molto più bello). Quindi è possibile fornire due diverse funzioni, a seconda che esista o meno numpy, e non comportino alcun costo di velocità. Per esempio:

def typecheck_without_numpy(...):
    ...

def typecheck_with_numpy(...):
    ...

try: 
    import numpy
    typecheck = typecheck_with_numpy
except ImportError:
    typecheck =  typecheck_without_numpy


def some_function(x):
    typecheck(x)

Ovviamente, puoi rinominare typecheck in qualcosa come type_check_and_cast e poi convertirlo in qualcosa che la tua funzione può gestire o aumentare un TypeError . In questo modo, il tuo codice non è macchiato dai controlli di tipo e, come ho detto, puoi spostare il typecheck in un decoratore, quindi le tue funzioni apparirebbero come

@typecheck
def some_function(x):
   ...
    
risposta data 10.03.2018 - 14:40
fonte

Leggi altre domande sui tag