Python字典参数和kwargs
在一个函数定义里面,下面的代码看起来有点复杂。我想知道有没有更好的方法来根据条件选择一个参数,而不是使用字典。这是因为在使用robotframework时,我觉得它对可变参数(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
4 个回答
-1
你可以先修改输入字典的默认值,然后就可以把所有对输入字典的检查都去掉,直接使用字典的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
0
所以你想要的密码(pwd)优先顺序是:
input_dict['passphrase_confirm']
kwargs['passphrase_confirm']
input_dict['passphrase']
kwargs['passphrase']
这里的 input_dict
可能是空的(None)
你应该这样写:
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 和 ...),我希望这样写更符合 Python 的风格。
1
根据msudder的建议,你可以把两个字典(一个是默认的,一个是传入的参数)合并在一起,然后从合并后的字典中获取结果。
关于合并的更多信息可以在这里找到。合并的写法是这样的:merged = dict(kwargs.items() + input_dict.items())
,在这个合并中,后面的字典会覆盖前面的字典的相同键。
2
我觉得最简单的办法就是把两个字典合并在一起,然后在合并后的结果上使用 get
方法。如果我理解你的逻辑没错(我也不太确定我理解得对不对……),你想要的是如果在其中一个字典里有“passphrase_confirm”的值,就用这个值;如果没有,就用“passphrase”。而且如果两个字典里都有这个值,你想要的是来自 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)