我有以下哪些方法有效,但我希望看到更清洁或pythonic的方式来做到这一点。
if options_dict['cids'] is not None and options_dict['mergekeys'] is not None:
# do something
如果按键'以上将会解决问题。和' mergekeys'存在。有没有更好的方法来做到这一点?此外,我如何同时检查以下内容。
if options_dict['cids'] is None and options_dict['mergekeys'] is None:
# do something
如果我能以优雅的方式在同一个if语句中结合上述两个内容,那将是非常棒的。
答案 0 :(得分:3)
您可以随时使用all
和generator expression:
if all(options_dict[x] is not None for x in ('cids', 'mergekeys')):
虽然我个人认为您当前的解决方案更好。它比这个更清晰,更有效。
如果您的长度是问题,那么您可以简单地将其分解为多行:
if options_dict['cids'] is not None and
options_dict['mergekeys'] is not None:
或者,为字典命名:
dct = options_dict
if dct['cids'] is not None and dct['mergekeys'] is not None:
all
和生成器表达式解决方案只应用于检查更多的密钥而不仅仅是两个或三个。
答案 1 :(得分:1)
使用列表推导来制作bool
的列表,告诉相应的选项是None
:
nones = [ options_dict[i] is None for i in [ 'cids', 'mergekeys' ] ]
然后,您可以使用any
和all
谓词来测试是否有None
:
if not any(nones):
# not a single one was none
elif all(nones):
# all were nones
答案 2 :(得分:0)
这是我可能做的事情:
>>> from operator import itemgetter
>>> my_dict = {"hey": 1, "ho": 2, "let's": 3, "go": None}
>>> my_keys = "hey", "ho"
>>> my_values = itemgetter(*my_keys)
>>> my_values(my_dict)
(1, 2)
>>> None not in my_values(my_dict)
True
>>> my_keys = "let's", "go"
>>> my_values = itemgetter(*my_keys)
>>> my_values(my_dict)
(3, None)
>>> None not in my_values(my_dict)
False
答案 3 :(得分:0)
第二个孤立的最佳方式是:
if options_dict['cids'] is options_dict['mergekeys'] is None:
虽然亲自派遣我会这样做:
# give meaningful name
flags = (options_dict['cids'] is None, options_dict['mergekeys'] is None)
if all(flags):
...
if not any(flags):
...
else:
...