Подтвердить что ты не робот

Python: проверьте, существует ли объект в области видимости

Возможный дубликат:
Python - проверка существующей переменной

Есть ли эффективный, простой и питонический способ проверить, существует ли объект в области?

В Python все объект (переменные, функции, классы, экземпляры экземпляров и т.д.), поэтому я ищу общий тест существования для объекта, независимо от того, что это такое.

Я ожидал, что там будет exists() встроенная функция, но я не смог найти ее, чтобы соответствовать счету.

4b9b3361

Ответ 1

вы всегда можете:

try:
    some_object
except NameError:
    do_something()
else:
    do_something_else()

Ответ 2

Кажется, вы ищете 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

Ответ 3

Я считаю, что вы ищете что-то вроде 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

Ответ 4

Будет разница, пытаетесь ли вы определить, существует ли локальный или атрибут объекта. Для объекта 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

Ответ 5

Можно написать свой собственный:

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