函数def中的以下代码在我看来是笨拙的。是否有更好的方法有条件地优先选择一个参数而不是字典。这是因为机器人框架之间的一些阻抗不匹配,而IMO没有(IMO)对kwargs有令人满意的处理:
def get_passwd(input_dict=None, **kwargs):
pswd = None
if input_dict:
if input_dict and input_dict.get('passphrase_confirm'):
pswd = input_dict['passphrase_confirm']
elif kwargs.get('passphrase_confirm'):
pswd = kwargs['passphrase_confirm']
if not pswd:
# here because there was no password_confirm or no input_dict, we look again in kwargs
if 'passphrase_confirm' in kwargs and kwargs['passphrase_confirm']:
pswd = kwargs['passphrase_confirm']
elif input_dict and 'passphrase' in input_dict and input_dict['passphrase_confirm']:
pswd = input_dict['passphrase']
elif 'passphrase' in kwargs and kwargs['passphrase']:
pswd = kwargs['passphrase']
return pswd
答案 0 :(得分:2)
我认为最简单的解决方案是合并两个词典,然后在结果上使用get
方法。如果我理解你的逻辑(而且我不确定我......),你想要" passphrase_confirm"的价值。如果它存在于其中一个词典中,如果它不存在,则需要"密码"。此外,如果两者都有,则需要来自input_dict
的那个。
我认为这样做符合您的要求,并且比原始代码更容易理解:
def get_passwd(input_dict=None, **kwargs):
kwargs = kwargs if input_dict is None else dict(kwargs.items() + input_dict.items())
if "passphrase_confirm" in kwargs:
return kwargs["passphrase_confirm"]
else:
return kwargs.get("passphrase", None)
答案 1 :(得分:1)
根据msudder的建议,您可以合并字典(默认和kwargs),然后从合并字典中获取答案。
有关合并here的更多信息。语法如下:merged = dict(kwargs.items() + input_dict.items())
,其中"获胜"字典最后。
答案 2 :(得分:0)
所以你想要pwd(按优先顺序):
input_dict['passphrase_confirm']
kwargs['passphrase_confirm']
input_dict['passphrase']
kwargs['passphrase']
其中input_dict
可能是无
你应该写:
def get_passwd(input_dict=None, **kwargs):
if input_dict and ('passphrase_confirm' in input_dict):
pwd = input_dict['passphrase_confirm']
elif 'passphrase_confirm' in kwargs:
pwd = kwargs['passphrase_confirm']
elif input_dict and ('passphrase' in input_dict):
pwd = input_dict['passphrase']
elif 'passphrase' in kwargs:
pwd = kwargs['passphrase']
else:
pwd = None
return pwd
这与原始代码相同(严格遵守偏好顺序),冗余度较低(如果是input_dict:如果是input_dict和......)并且是(我希望)更多pythonic
答案 3 :(得分:-1)
更改输入dict的签名默认值然后你可以删除input_dict上的所有测试以简单地使用dict.get制作
def get_passwd(input_dict={}, **kwargs):
pswd = None
if input_dict.get('passphrase_confirm'):
pswd = input_dict['passphrase_confirm']
elif kwargs.get('passphrase_confirm'):
pswd = kwargs['passphrase_confirm']
if not pswd:
# here because there was no password_confirm so use passphrase
if input_dict.get('passphrase'):
pswd = input_dict['passphrase']
elif kwargs.get('passphrase'):
pswd = kwargs.get('passphrase')
return pswd