Python: check if object exists in scope
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Python - checking variable existing
是否有一种有效、简单和Python般的方法来检查范围内是否存在一个物体?
在Python中,一切都是一个对象(变量、函数、类、类实例等),所以我正在为一个对象寻找一个通用的存在性测试,不管它是什么。
我有一半的期望是有一个
你可以一直:
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 |