2013-06-06 14 views
7

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']

+0

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. –

risposta

8

utilizzando type(POSSIBLE_MATCHER).__name__ è IMHO abbastanza soluzione elegante per il tipo di controllo senza dover per importare il modulo.

Problemi correlati