python是否有快捷方式来检查对象是否具有属性?

时间:2018-08-16 16:10:41

标签: python string python-3.x if-statement conditional-operator

背景是我从JSON API获取数据,其中许多字段是可选的,并且我希望数据库中的大多数字段。当特定字段不可用时,我希望将一个空字符串("")写入数据库。

目前我正在做

if jsonobject.what_i_look_for:
  dbstring = jsonobject.what_i_look_for
else:
  dbstring = ""

然后将dbstring插入数据库。但是,我现在得到了更多这些字段,我想要一个更简洁的代码,而不是包含大约80%的if语句的函数。

我发现if-shorthandsthis的简写形式来检查变量是否为空,但两者似乎都不能直接作为字符串工作。我已经在交互式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是一个示例对象。

1 个答案:

答案 0 :(得分:3)

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')

即使缺少object属性,您也可以添加默认值:

getattr(obj, 'foobar', 'spamegg')

以上将输出值obj.foobar,如果缺少foobar,则将输出spamegg

您可能还对hasattr感兴趣,该True返回False / AttributeError进行属性存在性检查,而不需要手动处理class SubClass(MainClass): def __init__(self, *args, **kwargs): super(SubClass, self).__init__(*args, **kwargs) self.subVar1 = -1 sub = SubClass(mainVar1=1, mainVar2=2)