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

26

可能是重复问题:
Python - 检查变量是否存在

有没有一种高效、简单和Pythonic的方法来检查作用域中是否存在一个对象?

在Python中,一切皆为对象(变量、函数、类、类实例等),因此我正在寻找一种通用的对象存在性测试方法,无论它是什么。

我半期望会有一个exists() 内置函数,但我找不到任何符合要求的函数。

5个回答

40

你可以这样做:

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

2
这通常被视为“Pythonic”的做法。 - martineau
3
当对象存在时,这种方法是有效的,因为捕获异常是一件代价高昂的事情。 - Jonathan Livni

30
你似乎正在寻找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

哈哈。没有人谈论 hasattr,所以我自己写了一个,确保我的例子能够正确运行,然后发布它,结果@Dog-eat-cat-world已经超过我了。 - Michael Kent

8

我相信你正在寻找类似 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

每次想要检查存在性时,您需要调用locals来更新locals字典。我猜这比try-except方法效率低,不过需要进行基准测试。 - Jonathan Livni
2
最好使用 l.has_key('foo') 来检查存在性。 - prgbenz
Python жӯЈеёёжҹҘжүҫеҗҚз§°зҡ„йЎәеәҸжҳҜ locals()гҖҒglobals() е’Ң vars(__builtin__)пјҢеӣ жӯӨиҝҷ并дёҚжҳҜжЈҖжҹҘеҗҚз§°жҳҜеҗҰеҪ“еүҚеңЁдҪңз”ЁеҹҹеҶ…гҖӮ - martineau
只是澄清一下,要使用 locals() 来查找变量是否存在,可以这样做:'variable_name' in locals()。它返回一个布尔值,指示变量在本地命名空间中的存在。 - Samie Bencherif

5

如果您想确定本地变量或对象属性是否存在,将会有所不同。对于对象,可以使用hasattr(object, "attribute")来实现。

这也适用于模块:

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

但是对于我们可以称为主要作用域的部分,您需要使用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

1

你可以自己编写:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接