Gibt es einen gemeinsamen Weg in Python zu überprüfen, ob ein Objekt einer beliebige Funktion Typ ist?

StackOverflow https://stackoverflow.com/questions/74092

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Funktion in Python, die über die Attribute von dir (obj) zurückgegeben wird iteriert, und ich möchte, um zu prüfen, ob einer der enthaltenen Objekte innerhalb einer Funktion, Methode, integrierte Funktion, usw. Normalerweise Sie könnten für diesen Einsatz aufrufbar (), aber ich möchte nicht, Klassen schließen. Das Beste, was ich mit so weit kommen habe, ist:

isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))

Gibt es eine zukunftssichere Art und Weise diese Prüfung zu tun?

Edit: Ich misspoke vor, als ich sagte: „In der Regel kann man aufrufbar () für diese, aber ich will nicht Klassen disqualifizieren“ I eigentlich tun will Klassen disqualifizieren. Ich möchte passen nur Funktionen, keine Klassen.

War es hilfreich?

Lösung

Das

inspizieren Modul hat genau das, was Sie wollen:

inspect.isroutine( obj )

FYI, ist der Code:

def isroutine(object):
    """Return true if the object is any kind of function or method."""
    return (isbuiltin(object)
            or isfunction(object)
            or ismethod(object)
            or ismethoddescriptor(object))

Andere Tipps

Wenn Sie möchten, Klassen und andere zufällige Objekte auszuschließen, die eine __call__ Verfahren haben kann, und prüfen Sie nur für Funktionen und Methoden, diese drei Funktionen in der inspect Modul

inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)

sollte das tun, was Sie in eine zukunftssichere Art und Weise wollen.

if hasattr(obj, '__call__'): pass

Das passt auch besser in Python „Duck Typing“ Philosophie, weil man nicht wirklich egal was ist es, so lange wie Sie es nennen kann.

Es ist erwähnenswert, dass callable() von Python entfernt werden und ist nicht in 3.0.

Je nachdem, was man unter 'Klasse':

callable( obj ) and not inspect.isclass( obj )

oder:

callable( obj ) and not isinstance( obj, types.ClassType )

Zum Beispiel sind die Ergebnisse unterschiedlich für 'dict':

>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top