Python:检查对象是否存在于范围内

时间:2011-06-17 08:45:11

标签: python

  

可能重复:
  Python - checking variable existing

是否有一种高效,简单和pythonic的方法来检查范围内是否存在对象?

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

我有一半期望会有exists() built-in function,但我找不到合适的账单。

5 个答案:

答案 0 :(得分:21)

你可以随时:

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

答案 1 :(得分:20)

您似乎正在搜索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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

无论您是要确定对象的本地属性还是对象属性,都会有所不同。对于一个对象,hasattr(对象,“属性”)将起到作用。

这也适用于模块:

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

但是对于我们可以称之为 main 范围的东西,你将不得不使用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

答案 4 :(得分: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
相关问题