我喜欢python one liners:
u = payload.get("actor", {}).get("username", "")
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,我无法控制"有效载荷"包含的内容,除了知道它是一本字典.所以,如果'有效载荷'没有"演员",或者它确实和演员有或没有"用户名",这个单行是好的.
当有效载荷有演员时,问题当然会出现,但演员不是字典.
有没有一种方法可以全面地做到这一点作为一个班轮,并考虑'演员'可能不是字典的可能性?
当然我可以使用'isinstance'检查类型,但那并不好.
我本身并不需要一个班轮,只是要求最有效的方法来确保'你'被填充,毫无例外,并且事先不知道'有效载荷'究竟是什么.
正如xnx建议的那样,你可以利用以下python范例:
你也可以在KeyErrors 上使用它:
try:
u = payload["actor"]["username"]
except (AttributeError, KeyError):
u = ""
Run Code Online (Sandbox Code Playgroud)
有时在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'))
Run Code Online (Sandbox Code Playgroud)
ps:__getattr__除此之外__getitem__,还可以重新定义,所以你甚至可以写Forgive(data)['actor'].username.get('default1').
| 归档时间: |
|
| 查看次数: |
1783 次 |
| 最近记录: |