【问题标题】: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,但我找不到任何符合要求的。

【问题讨论】:

    标签: python


    【解决方案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”的做法。
        • 这在大多数情况下对象确实存在时非常有效,因为捕获异常是一个代价高昂的事件
        猜你喜欢
        • 2021-03-30
        • 2011-03-31
        • 2020-03-19
        • 1970-01-01
        • 2021-04-01
        • 2017-05-16
        • 2022-01-16
        • 2013-01-04
        • 2023-04-03
        相关资源
        最近更新 更多