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

Jon*_*han 18 python

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

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

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

我一半期望有一个exists() 内置的功能,但我找不到任何适合的账单.

Jon*_*han 22

你总是可以:

try:
    some_object
except NameError:
    do_something()
else:
    do_something_else()
Run Code Online (Sandbox Code Playgroud)

  • 在大多数情况下,当对象确实存在时,这是有效的,因为捕获异常是一个代价高昂的事件 (3认同)
  • 这通常被认为是"Pythonic"的做法. (2认同)

Mic*_*ent 22

你似乎在搜索hasattr().您可以使用它来查看在对象的命名空间范围内(甚至导入的模块是对象),是否存在给定的属性名称.

所以,我可以这样做:

>>> import math
>>> hasattr(math, 'atan')
True
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

>>> class MyClass(object):
...     def __init__(self):
...         self.hello = None
... 
>>> myObj = MyClass()
>>> hasattr(myObj, 'hello')
True
>>> hasattr(myObj, 'goodbye')
False
Run Code Online (Sandbox Code Playgroud)


cwa*_*ole 6

我相信你正在寻找像当地人这样的东西.以下是它的工作原理:

>>> foo = 1
>>> l = locals()
>>> print l
{'__builtins__': <module '__builtin__' (built-in)>, 'l': {...}, 
 '__package__': None,'__name__':'__main__', 'foo': 1, '__doc__': None}
>>> print l['foo']
1
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 l.has_key('foo') 来检查存在性 (2认同)

Dog*_*rld 5

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

这也适用于模块:

import math
hasattr(math,"pow") => True
Run Code Online (Sandbox Code Playgroud)

但是对于我们可以称之为范围的东西,你将不得不使用locals(),因为hasattr()需要某种对象来挖掘.在这种情况下没有......

exists_mainscope = lambda name: locals().has_key(name)
exists_mainscope("test") => False
Run Code Online (Sandbox Code Playgroud)

那么,您正在寻找的可能是以下内容:

def exists(name,obj=None):
 if obj is None: return locals().has_key(name)
 else: return hasattr(obj,name)

enter code here
Run Code Online (Sandbox Code Playgroud)