python 是否有 shorthand 来检查对象是否具有属性?
Does python have a shorthand to check if an object has an attribute?
背景是我从 JSON API 获取数据,其中很多字段是可选的,我想要数据库中的大部分字段。当特定字段不可用时,我想将一个空字符串 (""
) 写入数据库。
目前我在做:
if jsonobject.what_i_look_for:
dbstring = jsonobject.what_i_look_for
else:
dbstring = ""
然后将dbstring插入数据库。然而,我现在得到了更多这些字段,我想要一个更简洁的代码,而不是一个包含大约 80% 的 if 语句的函数。
我发现 if-shorthands and this shorthand 可以检查变量是否为空,但两者似乎都不能直接用作字符串。我在交互式 python 3.5.2 shell:
中使用 print()
对此进行了测试
>>> print(testvar or "")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'testvar' is not defined
>>> print(testvar if testvar else "")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'testvar' is not defined
这:echo (isset($testvar) ? $testvar : "");
是 PHP 等同于我所寻求的。
编辑: 因为它似乎相关:我试图处理的对象来自 Telegram 的 JSON API。我使用 python-telegram-bot
作为库,this 是一个示例对象。
Pythonic 方法是注意 NameError
变量未定义时引发的异常,名称未绑定精确到任何对象。
因此,例如:
try:
foobar
except NameError:
# Do stuffs
print('foobar is not defined')
raise # raise the original exception again, if you want
名称驻留在名称空间中,例如本地名称位于 locals()
(dict
) 命名空间中,全局名称位于 globals()
(dict
) 命名空间中。您可以定义一个函数,该函数将名称字符串和命名空间作为参数来检查是否存在,这是一个将命名空间作为 dict
传递并捕获 KeyError
:
的提示
In [1213]: def is_defined(name, namespace):
...: try:
...: namespace[name]
...: except KeyError:
...: return False
...: return True
...:
In [1214]: is_defined('spamegg', globals())
Out[1214]: False
In [1215]: spamegg = 10
In [1216]: is_defined('spamegg', globals())
Out[1216]: True
另一方面,如果您要获取对象的属性字符串的值,getattr
是可行的方法:
getattr(obj, attr)
例如下面两个是等价的:
obj.foobar
getattr(obj, 'foobar')
甚至你可以在缺少对象属性时添加一个默认值:
getattr(obj, 'foobar', 'spamegg')
以上将输出值obj.foobar
,如果缺少foobar
将输出spamegg
.
您可能还对 hasattr
感兴趣 returns True
/False
用于属性存在性检查,而不是需要手动处理 AttributeError
.
背景是我从 JSON API 获取数据,其中很多字段是可选的,我想要数据库中的大部分字段。当特定字段不可用时,我想将一个空字符串 (""
) 写入数据库。
目前我在做:
if jsonobject.what_i_look_for:
dbstring = jsonobject.what_i_look_for
else:
dbstring = ""
然后将dbstring插入数据库。然而,我现在得到了更多这些字段,我想要一个更简洁的代码,而不是一个包含大约 80% 的 if 语句的函数。
我发现 if-shorthands and this shorthand 可以检查变量是否为空,但两者似乎都不能直接用作字符串。我在交互式 python 3.5.2 shell:
中使用print()
对此进行了测试
>>> print(testvar or "")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'testvar' is not defined
>>> print(testvar if testvar else "")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'testvar' is not defined
这:echo (isset($testvar) ? $testvar : "");
是 PHP 等同于我所寻求的。
编辑: 因为它似乎相关:我试图处理的对象来自 Telegram 的 JSON API。我使用 python-telegram-bot
作为库,this 是一个示例对象。
Pythonic 方法是注意 NameError
变量未定义时引发的异常,名称未绑定精确到任何对象。
因此,例如:
try:
foobar
except NameError:
# Do stuffs
print('foobar is not defined')
raise # raise the original exception again, if you want
名称驻留在名称空间中,例如本地名称位于 locals()
(dict
) 命名空间中,全局名称位于 globals()
(dict
) 命名空间中。您可以定义一个函数,该函数将名称字符串和命名空间作为参数来检查是否存在,这是一个将命名空间作为 dict
传递并捕获 KeyError
:
In [1213]: def is_defined(name, namespace):
...: try:
...: namespace[name]
...: except KeyError:
...: return False
...: return True
...:
In [1214]: is_defined('spamegg', globals())
Out[1214]: False
In [1215]: spamegg = 10
In [1216]: is_defined('spamegg', globals())
Out[1216]: True
另一方面,如果您要获取对象的属性字符串的值,getattr
是可行的方法:
getattr(obj, attr)
例如下面两个是等价的:
obj.foobar
getattr(obj, 'foobar')
甚至你可以在缺少对象属性时添加一个默认值:
getattr(obj, 'foobar', 'spamegg')
以上将输出值obj.foobar
,如果缺少foobar
将输出spamegg
.
您可能还对 hasattr
感兴趣 returns True
/False
用于属性存在性检查,而不是需要手动处理 AttributeError
.