当前位置:  开发笔记 > 编程语言 > 正文

python .get()和None

如何解决《python.get()和None》经验,为你挑选了1个好方法。

我喜欢python one liners:

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

我面临的问题是,我无法控制"有效载荷"包含的内容,除了知道它是一本字典.所以,如果'有效载荷'没有"演员",或者它确实和演员有或没有"用户名",这个单行是好的.

当有效载荷有演员时,问题当然会出现,但演员不是字典.

有没有一种方法可以全面地做到这一点作为一个班轮,并考虑'演员'可能不是字典的可能性?

当然我可以使用'isinstance'检查类型,但那并不好.

我本身并不需要一个班轮,只是要求最有效的方法来确保'你'被填充,毫无例外,并且事先不知道'有效载荷'究竟是什么.



1> Tamas Hegedu..:

使用EAFP

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

比许可更容易请求宽恕

你也可以在KeyErrors 上使用它:

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


这里似乎有一个回声...但无论如何,如果你想沿着完整的EAFP路线走下去,你肯定也需要捕捉`KeyError`.
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有