Abbiamo una funzione che accetta una varietà di diversi tipi di input: una funzione, una stringa, un'espressione regolare compilata, uno Hamcrest Matcher e filtra un elenco in modo appropriato in base al tipo di input.isinstance senza importare i candidati
Attualmente stiamo utilizzando isinstance(our_filter, hamcrest.matcher.Matcher)
, ma ciò richiede che venga richiesto l'installazione di Hamcrest.
Stiamo considerando l'utilizzo di corrispondenze di stringa su inspect.getmro(type(POSSIBLE_MATCHER))
; ma questo sembra impuro. Potrebbero esserci anche opzioni con try
/except
in base alla dichiarazione di importazione.
Qual è l'approccio migliore?
Con l'aiuto di @dblslash, questo è il migliore che abbia avuto finora:
[x.__module__+"."+x.__name__ for x in inspect.getmro(type(POSSIBLE_MATCHER))]
['hamcrest.core.core.isequal.IsEqual', 'hamcrest.core.base_matcher.BaseMatcher', 'hamcrest.core.matcher.Matcher', 'hamcrest.core.selfdescribing.SelfDescribing', '__builtin__.object']
Ho avuto un problema simile e ho finito con l'uso di 'if str (data .__ class__) == ':' .... Non userei try/catch perché richiede l'importazione del modulo al primo utilizzo, che in alcuni casi può causare fastidiosi ritardi e, naturalmente, prende memoria se infine si scopre che in realtà non è necessario il modulo importato perché l'input era di tipo diverso. –