gpt4 book ai didi

python .get() 和无

转载 作者:太空狗 更新时间:2023-10-30 00:31:38 25 4
gpt4 key购买 nike

我喜欢 python one liners:

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

我面临的问题是,除了知道它是一本字典之外,我无法控制“有效负载”包含的内容。因此,如果“payload”没有“actor”,或者它有并且 actor 有或没有“username”,这个单行代码就可以了。

当 payload 确实有 actor,但 actor 不是字典时,问题当然会出现。

有没有一种方法可以像单行一样全面地做到这一点,并考虑“ Actor ”可能不是字典的可能性?

当然,我可以使用“isinstance”检查类型,但这不是很好。

我本身并不需要一个衬里,只是要求以最有效的方式确保“u”被填充,无一异常(exception),并且事先不知道“payload”中到底是什么。

最佳答案

使用 EAFP

正如 xnx 所建议的,您可以利用以下 python 范例:

Easier to ask for forgiveness than permission

您也可以在 KeyError 上使用它:

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

使用具有宽松索引的包装器

有时在 Python 中使用类似 null 条件运算符的东西会很好。使用一些辅助类,可以将其压缩为单行表达式:

class Forgive:
def __init__(self, value = None):
self.value = value
def __getitem__(self, name):
if self.value is None:
return Forgive()
try:
return Forgive(self.value.__getitem__(name))
except (KeyError, AttributeError):
return Forgive()
def get(self, default = None):
return default if self.value is None else self.value

data = {'actor':{'username': 'Joe'}}
print(Forgive(data)['actor']['username'].get('default1'))
print(Forgive(data)['actor']['address'].get('default2'))

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

关于python .get() 和无,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34357513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com