python:检查对象是否存在于作用域中

Python: check if object exists in scope

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python - checking variable existing

是否有一种有效、简单和Python般的方法来检查范围内是否存在一个物体?

在Python中,一切都是一个对象(变量、函数、类、类实例等),所以我正在为一个对象寻找一个通用的存在性测试,不管它是什么。

我有一半的期望是有一个exists()内置功能,但我找不到任何适合这个账单的功能。


你可以一直:

1
2
3
4
5
6
try:
    some_object
except NameError:
    do_something()
else:
    do_something_else()


您似乎在搜索hasattr()。您可以使用它来查看在对象的名称空间范围(甚至导入的模块都是对象)中是否存在给定的属性名。

所以,我可以做到:

1
2
3
>>> import math
>>> hasattr(math, 'atan')
True

或者类似的:

1
2
3
4
5
6
7
8
9
>>> class MyClass(object):
...     def __init__(self):
...         self.hello = None
...
>>> myObj = MyClass()
>>> hasattr(myObj, 'hello')
True
>>> hasattr(myObj, 'goodbye')
False


无论您是试图确定对象的局部属性还是属性是否存在,都会存在差异。对于一个对象,hasattr(object,"attribute")将完成这个技巧。

这也适用于模块:

1
2
import math
hasattr(math,"pow") => True

但是对于我们所称的主作用域,您必须使用locals(),因为hasattr()需要某种对象来挖掘。在这种情况下,没有…

1
2
exists_mainscope = lambda name: locals().has_key(name)
exists_mainscope("test") => False

所以,你要找的可能是:

1
2
3
4
5
def exists(name,obj=None):
 if obj is None: return locals().has_key(name)
 else: return hasattr(obj,name)

enter code here

我相信你在找像本地人一样的东西。它的工作原理如下:

1
2
3
4
5
6
7
>>> foo = 1
>>> l = locals()
>>> print l
{'__builtins__': <module '__builtin__' (built-in)>, 'l': {...},
 '__package__': None,'__name__':'__main__', 'foo': 1, '__doc__': None}
>>> print l['foo']
1


你可以自己写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import __builtin__
import sys

def exists(name):
    return (name in sys._getframe(1).f_locals  # caller's locals
         or name in sys._getframe(1).f_globals # caller's 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