python dict参数和/或kwargs

时间:2014-05-29 22:31:29

标签: python dictionary kwargs

函数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

4 个答案:

答案 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