当我正在调用的函数有很多参数,而且我想要有条件地包含一个函数时,我是否必须对该函数进行两次单独的调用,或者某种程度上没有传递任何参数(几乎像{ {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
答案 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
。