将空参数传递给Python函数?

时间:2018-02-23 15:50:48

标签: python

当我正在调用的函数有很多参数,而且我想要有条件地包含一个函数时,我是否必须对该函数进行两次单独的调用,或者某种程度上没有传递任何参数(几乎像{ {1}})所以我没有为特定参数传递任何参数?

例如,我想有时传递参数None的参数,但有时我想传递该参数的任何内容。这段代码有效,但感觉我复制的次数超出了我的预期。

我正在调用的函数位于第三方库中,因此我无法更改它处理接收参数的方式。如果我为sixth传递None,则该函数会引发异常。我需要传递sixth或不传递任何内容。

我目前在做什么:

'IMPORTANT_VALUE'

我想做什么:

def do_a_thing(stuff, special=False):

    if special:
        response = some.library.func(
            first=os.environ['first'],
            second=stuff['second'],
            third=stuff['third']
            fourth='Some Value',
            fifth=False,
            sixth='IMPORTANT_VALUE',
            seventh='example',
            eighth=True
        )
    else:
        response = some.library.func(
            first=os.environ['first'],
            second=stuff['second'],
            third=stuff['third']
            fourth='Some Value',
            fifth=False,
            seventh='example',
            eighth=True
        )

    return response

3 个答案:

答案 0 :(得分:5)

一种解决方案可能是使用要传递给函数的值构建一个dict,根据special值进行修改。然后使用python unpacking将其展开为要调用的函数的命名参数列表:

def do_a_thing(stuff, special=False):

    kwargs = dict(
        first=os.environ['first'],
        second=stuff['second'],
        third=stuff['third']
        fourth='Some Value',
        fifth=False,
        seventh='example',
        eighth=True
    )

    if special:
        kwargs['sixth'] = 'IMPORTANT_VALUE'

    return some.library.func(**kwargs)

答案 1 :(得分:1)

由于函数是第一类对象,因此可以将该函数传递给将正确构造所需参数的包装器。这将使该段代码可重用,但也为您提供更多灵活性,例如需要处理错误。

def wrapper(some_library_func, special=False):
# you could have try catch here if needed. 
  kwards = {
    'first': os.environ['first'],
    'second': stuff['second'],
    'third': stuff['third'],
    'fourth': 'Some Value',
    'fifth': False,
    'seventh': 'example',
    'eighth': True
  }

  if special:
    kwards['sixth'] = 'IMPORTANT_VALUE'

  return some_library_func(**kwards)

答案 2 :(得分:-2)

我没有看到你的做法有什么问题,使用函数来定义变量。您应该在全局范围内声明********** Result for co.doppl.so.RepositoryTest ********** Success Total: 1 Failures: 0 2018-02-23 09:50:58.086219-0600 iosTest[41775:778685] [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert ,然后在函数顶部添加special_value