检查变量是不是在python中定义的简单方法? [复制]

Posted

技术标签:

【中文标题】检查变量是不是在python中定义的简单方法? [复制]【英文标题】:Easy way to check that a variable is defined in python? [duplicate]检查变量是否在python中定义的简单方法? [复制] 【发布时间】:2010-10-19 12:22:08 【问题描述】:

有什么方法可以检查是否定义了具有指定名称的变量(类成员或独立变量)?示例:

if "myVar" in myObject.__dict__ : # not an easy way
  print myObject.myVar
else
  print "not defined"

【问题讨论】:

第三方类,需要为我的私人目的设置一个标志,不想乱类__init__() 这真是令人困惑。为什么要写很多代码来确定使用什么变量?只需创建一个实例,打印 instance.__dict__.keys() 或执行 dir(instance) 即可知道所有属性名称。 恐怕我也糊涂了。该问题询问班级成员和独立变量。显然,对于独立的***变量没有 init ;哪个第 3 方 miasma 构建得如此糟糕,以至于它的许多变量在多个范围级别上都处于完全不存在的风险中? 这是一个让我想到这个问题的例子。在 Django 应用程序中,我们有一个设置模块,具有可选设置,例如“# MYLIST =[1,2]”。如果列表存在(MYLIST += [3]),我想扩展它,如果它不存在,我想定义它。 (MYLIST = [3])。 @S.Lott 我也在这里,因为有一个设置文件。如果在设置文件中设置了变量,我想使用它。如果不是,我想做点别的。将所有可能的设置变量初始化为无似乎不切实际。 【参考方案1】:

测试变量 myvar 是否已定义:

result = dir().count('myvar')

如果定义了myvar,则结果为1,否则为0

这在 Python 3.1.2 版中运行良好。

【讨论】:

那为什么不直接'myvar' in dir()呢?【参考方案2】:

在 python 中阅读和或技巧: locals() 和 a 中的“a”

【讨论】:

如果 a 是空字符串或任何其他虚假值,则失败。【参考方案3】:

一种紧凑的方式:

print myObject.myVar if hasattr(myObject, 'myVar') else 'not defined'

不过,htw 的方式更加 Pythonic。

hasattr()x in y.__dict__ 不同,不过:hasattr() 考虑了继承的类属性,以及从__getattr__ 返回的动态属性,而y.__dict__ 仅包含那些属于@ 属性的对象987654328@实例。

【讨论】:

我认为他只是在寻找 hasattr()。 是的,很可能。那么全局变量呢? (在模块中声明,而不是在类命名空间中)? @Eye of Hell: 也许(x in globals()),但我真正的答案是需要这样做的代码是非 Pythonic 的,实际上应该将变量初始化为 None。 不要错过这个答案: ***.com/a/843293/1447509 对于未附加到对象的局部变量:print('defined') if 'myVar' in locals() else print('undefined')。这比使用globals() 更通用,因为locals() 包含globals() 中定义的所有名称。【参考方案4】:

Paolo 是对的,如果需要,您的做事方式可能会出现问题。但如果你只是做一些快速而肮脏的事情,你可能不关心Idiomatic Python anway,那么这可能会更短。

try: x
except: print "var doesn't exist"

【讨论】:

【参考方案5】:
try:
    print myObject.myVar
except NameError:
    print "not defined"

【讨论】:

至少得到正确的变量和输出:-) +1 如果 myObject 已定义,但没有 'myVar',您将获得 AttributeError。

以上是关于检查变量是不是在python中定义的简单方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Python中是不是存在方法?

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

检查是不是定义了变量?

检查变量是不是为字符串的简单方法?

如何在 Perl 中检查多个变量是不是为空

检查 EJS 模板中是不是存在变量的正确方法是啥(使用 ExpressJS)?