Python字典参数和kwargs

1 投票
4 回答
1721 浏览
提问于 2025-04-18 07:59

在一个函数定义里面,下面的代码看起来有点复杂。我想知道有没有更好的方法来根据条件选择一个参数,而不是使用字典。这是因为在使用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)

撰写回答