好的,这个令人困惑。我的旧代码有点像
map(lambda x:x.func1(arg1), other_args_to_be_mapped)
现在我想制作arg1
- > *args
other_args_to_be_mapped
保持不变。
在func1
中,参数的长度将被检查不同的操作。我的问题是
1)将检查哪个长度? arg1
或other_args_to_be_mapped
2)在func1
中,我该如何设置默认值?就像
def func1(arg1=something)
但现在有了多个参数,我不知道如何处理初始化。我希望能够做类似
的事情def func1(args*=something, something_else)
这甚至可能吗?
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您正在寻找variable arguments。如果您遵守逻辑顺序(首先是固定参数,然后是关键字参数或变量参数),这些可以与固定参数混合使用。
例如,下面显示了如何映射到接受一个常量参数和一个变量参数的函数。如果您想要不同的行为,请提供您要完成的具体示例
import random
class Foo:
def get_variable_parameters(self):
return [1] if random.random() > .5 else [1,2]
def foo( self, arg, *args ):
print("Doing stuff with constant arg", arg)
if len(args) == 1:
print("Good",args)
else:
print("Bad",args)
list(map( lambda x : x.foo( 'Static Argument', *x.get_variable_parameters()), [Foo(),Foo(),Foo()] ))
我们不知道将有多少参数传递给foo
(在这个简单的情况下,它是一两个),但是" *&#34 ;符号接受任何数量的对象传递
注意我已在map
中封装list
以便对其进行评估,因为在python3中它是一个生成器。 List comprehension在python中可能更惯用。也不要忘记你总是可以使用一个简单的for循环 - 混淆或复杂的map
调用远不如一个明确的(但是几行)for循环,imo。
如果您尝试在地图调用中组合多个参数,我建议使用与zip函数相同的变量参数策略,例如,
def foo(a,*b): ...
map(lambda x : foo(x[0],*x[1]), zip(['a','b'],[ [1], [1,2] ]))
在这种情况下,foo
将首先调用foo('a',1)
,然后调用foo('b',2,3)