关于python:最佳实践:如何将多个参数传递给函数?

Best practice: how to pass many many arguments to a function?

我正在运行一些数值模拟,其中我的主要函数必须接收大量的参数——我说的是10到30个参数,这取决于要运行的模拟。

处理这种情况的最佳实践是什么?在我的例子中,将代码分成10个函数,每个函数有3个参数,听起来不太可行。

如果这不是这类问题的最佳论坛,你能推荐到哪里提问吗?

我要做的是创建一个类的实例(没有方法),将输入存储为该实例的属性,然后传递该实例-这样函数只接收一个输入。

我喜欢这样做是因为代码看起来很干净,易于阅读,而且我发现很容易定义和运行替代方案。

我不喜欢它,因为在函数中访问类属性比访问局部变量慢(请参见:如何/为什么通过将类属性复制到局部变量来优化代码?)因为它不是一个有效的内存使用-太多的数据存储多次不必要。

有什么想法/建议/建议吗?谢谢!

1
2
3
4
5
6
myinput=MyInput()
myinput.input_sql_table = that_sql_table
myinput.input_file = that_input_file
myinput.param1 = param1
myinput.param2 = param2
myoutput = calc(myinput)

备选方案:

1
2
3
4
5
6
7
inputs=collections.OrderedDict()
scenarios=collections.OrderedDict()
inputs['base scenario']=copy.deepcopy(myinput)

inputs['param2 = 100']=copy.deepcopy(myinput)
inputs['param2 = 100'].param2 = 100
# loop through all the inputs and stores the outputs in the ordered dictionary scenarios


我不认为这是一个堆垛溢出问题,更多的是一个软件工程问题。例如,看看这个问题。

至于这是否是一个好的设计模式,这是一个处理大量参数的好方法。你提到这在内存和速度方面不是很有效,但我认为你做的是一个不适当的微观优化。

就内存而言,运行python解释器的开销将使实例化类所使用的两个额外字节相形见绌。

除非您运行了一个分析器并确定访问该选项类的成员会减慢您的速度,否则我不会担心它。尤其如此,因为您使用的是Python。如果速度是一个真正的问题,你应该使用其他东西。

您可能没有意识到这一点,但大多数用于Python的大型数字压缩库实际上不是用Python编写的,它们只是围绕C/C++库的包装器,速度更快。

我建议阅读这篇文章,它已经很好地证明了"过早的优化是万恶之源"。


你可以这样输入一本字典:

1
2
3
4
5
all_the_kwargs = {kwarg1: 0, kwarg2: 1, kwargN: xyz}
some_func_or_class(**all_the_kwargs)

def some_func_or_class(kwarg1: int = -1, kwarg2: int = 0, kwargN: str = ''):
    print(kwarg1, kwarg2, kwargN)

或者您可以使用一些命名的元组,如这里引用的:namedtuple中的类型提示

还要注意,根据您使用的Python版本,可以传递到函数调用中的参数数量可能会有限制。

或者你可以只用一本字典:

1
2
def some_func(a_dictionary):
   a_dictionary.get('argXYZ', None) # defaults to None if argXYZ doesn't exist