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  |