处理可选的函数参数

时间:2013-12-19 15:59:48

标签: python

假设您有一个接受一个或多个可选参数的函数。解决这个问题的最佳方式是什么?

这是一个函数,其中我有两个必需的参数,一个可选的更改输出:

def get_cases(**kwargs):
    """Returns a list of test cases for a test suite or specific section in a test suite."""
    if 'section_id' not in kwargs:
        req = requests.get(settings.URL + 'get_cases/' + str(kwargs['project_id']) +
                           '&suite_id=' + str(kwargs['suite_id']),
                           auth=(settings.USR, settings.PWD), headers=headers)
    else:
        req = requests.get(settings.URL + 'get_cases/' + str(kwargs['project_id']) +
                           '&suite_id=' + str(kwargs['suite_id']) +
                           '&section_id=' + str(kwargs['section_id']),
                           auth=(settings.USR, settings.PWD), headers=headers)
    return req.json()

我使用** kwargs捕获所有值,然后如果字典中存在可选值,则执行不同的操作。

除了上面代码中的冗余(2个重复行),是否有更好的方法来处理可选参数?我现在对重复的线条并不太感兴趣。

3 个答案:

答案 0 :(得分:3)

只需使用keyword argument :(如果可以传递None,则可以使用其他值替换None。如果section_id可以是*,则将section_id设置为特殊对象而不是None(可以使用object()生成对象)(object()的连续调用与内存不相等地址不同)。

def get_cases(some_args, another_arg, section_id=None):
    if section_id is None:
        # A value for section_id wasn't passed.
    else:
        # An value for section_id was passed.

^使用我的解决方案传递特殊对象将使代码认为参数未被传递

答案 1 :(得分:1)

在这种特定情况下,我会使用字典来构建查询字符串。

import urllib
def get_cases(project_id, **kwargs):
    qs = urllib.urlencode(kwargs)
    url = settings.URL + 'get_cases/' + project_id + "?" + qs
    req = requests.get(url, auth=(settings.USR, settings.PWD), headers=headers))

答案 2 :(得分:0)

def get_cases(**kwargs):    
     req = requests.get(settings.URL + 'get_cases/' + str(kwargs['project_id']) +
            '&suite_id=' + str(kwargs['suite_id']) +
            ('' if 'section_id' not in kwargs else '&section_id=' + str(kwargs['section_id'])),
            auth=(settings.USR, settings.PWD), headers=headers)
    return req.json()