Ответ 1
вы всегда можете:
try:
some_object
except NameError:
do_something()
else:
do_something_else()
Возможный дубликат:
Python - проверка существующей переменной
Есть ли эффективный, простой и питонический способ проверить, существует ли объект в области?
В Python все объект (переменные, функции, классы, экземпляры экземпляров и т.д.), поэтому я ищу общий тест существования для объекта, независимо от того, что это такое.
Я ожидал, что там будет exists()
встроенная функция, но я не смог найти ее, чтобы соответствовать счету.
вы всегда можете:
try:
some_object
except NameError:
do_something()
else:
do_something_else()
Кажется, вы ищете hasattr(). Вы используете его, чтобы определить, существует ли в пространстве имен объекта (и даже импортированных модулей) объекты имя данного атрибута.
Итак, я могу сделать:
>>> import math
>>> hasattr(math, 'atan')
True
или что-то вроде:
>>> class MyClass(object):
... def __init__(self):
... self.hello = None
...
>>> myObj = MyClass()
>>> hasattr(myObj, 'hello')
True
>>> hasattr(myObj, 'goodbye')
False
Я считаю, что вы ищете что-то вроде locals. Вот как это работает:
>>> foo = 1
>>> l = locals()
>>> print l
{'__builtins__': <module '__builtin__' (built-in)>, 'l': {...},
'__package__': None,'__name__':'__main__', 'foo': 1, '__doc__': None}
>>> print l['foo']
1
Будет разница, пытаетесь ли вы определить, существует ли локальный или атрибут объекта. Для объекта hasattr (object, "attribute" ) выполнит трюк.
Это также работает с модулями:
import math
hasattr(math,"pow") => True
Но для чего мы можем назвать область main, вам придется использовать locals(), так как hasattr() нужен какой-то объект для вставки. В этом случае нет...
exists_mainscope = lambda name: locals().has_key(name)
exists_mainscope("test") => False
Итак, то, что вы ищете, может быть следующим:
def exists(name,obj=None):
if obj is None: return locals().has_key(name)
else: return hasattr(obj,name)
enter code here
Можно написать свой собственный:
import __builtin__
import sys
def exists(name):
return (name in sys._getframe(1).f_locals # caller locals
or name in sys._getframe(1).f_globals # caller globals
or name in vars(__builtin__) # built-in
)
if __name__=='__main__':
def foobar():
local_var = 42
print 'exists("global_var"):', exists("global_var")
print 'exists("local_var"):', exists("local_var")
print 'exists("baz"):', exists("baz") # undefined
print 'exists("dict"):', exists("dict") # built-in
foobar() # global_var doesn't exist yet
global_var = 'I think, therefore I am'
print 'exists("global_var"):', exists("global_var")
foobar() # now global_var exists