En la función __getattr__()
, si no se encuentra una variable referida, da un error. ¿Cómo puedo verificar si una variable o método existe como parte de un objeto?
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
Es más fácil pedir perdón que pedir permiso.
No compruebe si existe un método. No pierda ni una sola línea de código en "comprobar"
try: dyn.mymethod() # How to check whether this exists or not # Method exists and was used. except AttributeError: # Method does not exist; What now?
fuente
dyn.mymethod()
genera unaAttributeError
.¿Compruebe si la clase tiene ese método?
hasattr(Dynamo, key) and callable(getattr(Dynamo, key))
o
hasattr(Dynamo, 'mymethod') and callable(getattr(Dynamo, 'mymethod'))
Puedes usar en
self.__class__
lugar deDynamo
fuente
None
no se puede llamar, por lo que podría hacerlocallable(getattr(Dynamo, 'mymethod', None))
. Usé esta respuesta porque mi super (). Mymethod () podría arrojarAttributeError
def getattr(object, name, default=None):
, sospecho que no es precisa porque si lo fuera, esperaría pasar None como tercer parámetro para no cambiar el comportamiento de la función.help(getattr)
dice "Cuando se proporciona un argumento predeterminado, se devuelve cuando el atributo no existe; sin él, se genera una excepción en ese caso". - (y de hecho puede comprobar que getattr genera una excepción si falta el atributo) tan claramente, sea lo que sea PyCharm, está mal.if hasattr(self, "work") and callable(self.work)
. Esto verifica si la instancia tiene un atributo de trabajo (puede ser una variable o una función) y luego verifica si se puede llamar (lo que significa que es una función).Puede intentar usar el módulo 'inspeccionar':
import inspect def is_method(obj, name): return hasattr(obj, name) and inspect.ismethod(getattr(obj, name)) is_method(dyn, 'mymethod')
fuente
Utilizo la siguiente función de utilidad. Funciona con lambda, métodos de clase y métodos de instancia.
Método de utilidad
def has_method(o, name): return callable(getattr(o, name, None))
Ejemplo de uso
Definamos la clase de prueba
class MyTest: b = 'hello' f = lambda x: x @classmethod def fs(): pass def fi(self): pass
Ahora puedes intentarlo
>>> 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
fuente
try
declaración) y verifica cada vez que el miembro es una función real. gran parte!¿Qué tal buscarlo en
dyn.__dict__
?try: method = dyn.__dict__['mymethod'] except KeyError: print "mymethod not in dyn"
fuente
Tal vez así, asumiendo que todos los métodos son invocables
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
fuente
Si su método está fuera de una clase y no desea ejecutarlo y generar una excepción si no existe:
'mymethod' in globals()
fuente
Creo que deberías mirar el
inspect
paquete. Te permite 'envolver' algunas de las cosas. Cuando usa eldir
método, también enumera los métodos integrados, los métodos heredados y todos los demás atributos que hacen posibles las colisiones, por ejemplo:class One(object): def f_one(self): return 'class one' class Two(One): def f_two(self): return 'class two' if __name__ == '__main__': print dir(Two)
La matriz de la que obtiene
dir(Two)
contienef_one
yf_two
y muchas cosas integradas. Coninspect
usted puede hacer esto:class One(object): def f_one(self): return 'class one' class Two(One): def f_two(self): return 'class two' if __name__ == '__main__': import inspect def testForFunc(func_name): ## Only list attributes that are methods for name, _ in inspect.getmembers(Two, inspect.ismethod): if name == func_name: return True return False print testForFunc('f_two')
Estos ejemplos aún enumeran ambos métodos en las dos clases, pero si desea limitar la inspección para que solo funcione en una clase específica, requiere un poco más de trabajo, pero es absolutamente posible.
fuente