python.get()和Non

2024-04-19 21:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢python的一行代码:

u = payload.get("actor", {}).get("username", "")

我面临的问题是,除了知道“payload”是一个字典之外,我无法控制“payload”包含什么。所以,如果“payload”没有“actor”,或者它有,actor有或没有“username”,这一行就可以了。在

当然,当有效负载有actor时,问题就出现了,但actor不是字典。在

有没有一种方法可以像一句简单的话那样全面地完成这一点,并考虑到“演员”可能不是字典的可能性?

当然,我可以用'isinstance'来检查类型,但那不是很好。在

我并不要求一个单一的班轮本身,只是要求最有效的方式,以确保'u'得到填充,没有例外,没有事先知道什么是'有效载荷'。在


Tags: 方法代码类型get字典方式username可能性
3条回答

使用EAFP

正如xnx建议的那样,您可以利用以下python范式:

Easier to ask for forgiveness than permission

您也可以在KeyErrors上使用它:

try:
    u = payload["actor"]["username"]
except (AttributeError, KeyError):
    u = ""

使用具有容错索引的包装器

有时候,在Python中使用类似于null条件运算符的东西会更好。使用某些helper类,可以将其压缩为一个线性表达式:

^{pr2}$

ps:除了__getitem__之外,还可以重新定义__getattr__,所以你甚至可以写Forgive(data)['actor'].username.get('default1')。在

为什么不使用例外:

try:
    u = payload.get("actor", {}).get("username", "")
except AttributeError:
    u = ""

黑格尔·黑格杜斯给出的答案是正确的,但是有一点需要注意的是,异常处理要比使用if..else语句慢得多。在

例如,如果您正在迭代数千个payload对象,而actor条目只是偶尔不是字典,那么这段代码是完全有效的。在

但是,如果您要迭代上千个payload对象,并且每个其他actor条目都不是字典,那么您最好使用此代码。在

u = ''
if 'actor' in payload and isinstance(payload['actor'], dict):
    u = payload['actor'].get('username', '')

更多讨论请点击这里--https://mail.python.org/pipermail/tutor/2011-January/081143.html

更新

此外,代码语句也可以作为一行代码重新编写,尽管没有两行语句那么易读

^{pr2}$

相关问题 更多 >