Python:检查范围内是不是存在对象[重复]

Posted

技术标签:

【中文标题】Python:检查范围内是不是存在对象[重复]【英文标题】:Python: check if object exists in scope [duplicate]Python:检查范围内是否存在对象[重复] 【发布时间】:2011-09-17 00:34:01 【问题描述】:

可能重复:Python - checking variable existing

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

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

我有一半期望会有一个exists() built-in function,但我找不到任何符合要求的。

【问题讨论】:

【参考方案1】:

您似乎在搜索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 的答案,所以我制作了一个,确保我的示例正常工作,然后发布它,然后 POW! @Dog-eat-cat-world 打败了我。【参考方案2】:

您是否尝试确定对象的本地属性或属性是否存在会有所不同。对于一个对象, hasattr(object, "attribute") 就可以了。

这也适用于模块:

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

但是对于我们可以称为 ma​​in 的作用域,您将不得不使用 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

【讨论】:

【参考方案3】:

可以自己写:

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

【讨论】:

【参考方案4】:

我相信您正在寻找类似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 方法效率低,尽管有一个基准订购 最好使用 l.has_key('foo') 来检查存在性 Python 通常查找名称的顺序是locals()globals()vars(__builtin__)——所以这不是名称目前在范围内。 澄清一下,要使用locals() 查找变量是否存在,您可以这样做:'variable_name' in locals()。它返回一个布尔值,指示变量是否存在于本地命名空间中【参考方案5】:

你总是可以的:

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

【讨论】:

这通常被认为是“Pythonic”的做法。 这在大多数情况下对象确实存在时非常有效,因为捕获异常是一个代价高昂的事件

以上是关于Python:检查范围内是不是存在对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JS检查深层对象属性是不是存在[重复]

Python检查字典中是不是存在值[重复]

检查属性中是不是存在对象[重复]

如何在oracle中检查对象是不是存在[重复]

Python3检查Unicode字符是不是不存在[重复]

如何检查javascript中的对象中是不是存在键[重复]