it-swarm.com.de

Wie prüfe ich, ob eine Methode in Python existiert?

Wird in der Funktion __getattr__() keine referenzierte Variable gefunden, wird ein Fehler ausgegeben. Wie kann ich überprüfen, ob eine Variable oder Methode als Teil eines Objekts vorhanden ist?

import string
import logging

class Dynamo:
 def __init__(self,x):
  print "In Init def"
  self.x=x
 def __repr__(self):
  print self.x
 def __str__(self):
  print self.x
 def __int__(self):
  print "In Init def"
 def __getattr__(self, key):
    print "In getattr"
    if key == 'color':
        return 'PapayaWhip'
    else:
        raise AttributeError


dyn = Dynamo('1')
print dyn.color
dyn.color = 'LemonChiffon'
print dyn.color
dyn.__int__()
dyn.mymethod() //How to check whether this exist or not
54
Rajeev

Wie wäre es mit dir() vor getattr()?

>>> "mymethod" in dir(dyn)
True
70
Michał Šrajer

Es ist einfacher, um Vergebung zu bitten, als um Erlaubnis zu bitten.

Prüfen Sie nicht, ob eine Methode existiert. Verschwenden Sie nicht eine einzige Codezeile für das "Prüfen".

try:
    dyn.mymethod() # How to check whether this exists or not
    # Method exists and was used.  
except AttributeError:
    # Method does not exist; What now?
100
S.Lott

Prüfen Sie, ob die Klasse eine solche Methode hat.

hasattr(Dynamo, key) and callable(getattr(Dynamo, key))

oder

hasattr(Dynamo, 'mymethod') and callable(getattr(Dynamo, 'mymethod'))

Sie können self.__class__ anstelle von Dynamo verwenden.

79
seriyPS

Sie können es mit dem 'inspect'-Modul versuchen:

import inspect
def is_method(obj, name):
    return hasattr(obj, name) and inspect.ismethod(getattr(obj, name))

is_method(dyn, 'mymethod')
6
vint83

Vielleicht so, vorausgesetzt, alle Methoden sind aufrufbar

app = App(root) # some object call app 
att = dir(app) #get attr of the object att  #['doc', 'init', 'module', 'button', 'hi_there', 'say_hi']

for i in att: 
    if callable(getattr(app, i)): 
        print 'callable:', i 
    else: 
        print 'not callable:', i
3
user6559980

Wie wäre es mit dyn.__dict__?

try:
    method = dyn.__dict__['mymethod']
except KeyError:
    print "mymethod not in dyn"
3
deStrangis

Wenn sich Ihre Methode außerhalb einer Klasse befindet und Sie sie nicht ausführen und eine Ausnahme auslösen möchten, falls sie nicht vorhanden ist:

'mymethod' in globals()

1
gerowam

Ich benutze die Utility-Funktion. Es funktioniert auf Lambda, Klassenmethoden sowie Instanzmethoden.

Utility-Methode

def has_method(o, name):
    return callable(getattr(o, name, None))

Verwendungsbeispiel

Definieren wir die Testklasse

class MyTest:
  b = 'hello'
  f = lambda x: x

  @classmethod
  def fs():
    pass
  def fi(self):
    pass

Jetzt kannst du versuchen,

>>> a = MyTest()                                                    
>>> has_method(a, 'b')                                         
False                                                          
>>> has_method(a, 'f')                                         
True                                                           
>>> has_method(a, 'fs')                                        
True                                                           
>>> has_method(a, 'fi')                                        
True                                                           
>>> has_method(a, 'not_exist')                                       
False                                                          
0
Shital Shah