我喜欢python one liners:
u = payload.get("actor", {}).get("username", "")
我面临的问题是,我无法控制"有效载荷"包含的内容,除了知道它是一本字典.所以,如果'有效载荷'没有"演员",或者它确实和演员有或没有"用户名",这个单行是好的.
当有效载荷有演员时,问题当然会出现,但演员不是字典.
有没有一种方法可以全面地做到这一点作为一个班轮,并考虑'演员'可能不是字典的可能性?
当然我可以使用'isinstance'检查类型,但那并不好.
我本身并不需要一个班轮,只是要求最有效的方法来确保'你'被填充,毫无例外,并且事先不知道'有效载荷'究竟是什么.
正如xnx建议的那样,你可以利用以下python范例:
比许可更容易请求宽恕
你也可以在KeyError
s 上使用它:
try: u = payload["actor"]["username"] except (AttributeError, KeyError): u = ""
有时在Python中使用类似空条件运算符的东西会很好.使用一些辅助类,可以将其压缩为单行表达式:
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:__getattr__
除此之外__getitem__
,还可以重新定义,所以你甚至可以写Forgive(data)['actor'].username.get('default1')
.