Python args和kwargs争论混乱

时间:2014-01-11 18:40:00

标签: python

我一直在阅读有关kwargs和args的内容,但在这种情况下我真的很难实现它们。

我有一个类的对象

a = MDFile()

有一个方法

a.create_matrix()

将返回n×m矩阵,其中n是MDFile中的粒子数。如果用户没有为方法指定任何参数,我希望它返回完整的n乘m矩阵。但是如果用户指定一个粒子数 - 比如他们只想要第五个粒子的信息,我希望他们能够做到:

a.create_matrix(particle_id=5)

并且它将仅返回矩阵的相应行,然后将是1xm数组。

如何使用kwargs和args实现这一目标?或者有更好的替代方法吗?似乎args需要某种默认值,我真的不想要。我也不太希望使用if语句分散方法,因为它会严重降低性能。

1 个答案:

答案 0 :(得分:3)

我认为@Martijn Pieters是对的。您将不得不使用if语句,坦率地说if语句不会产生太大影响。例如,请考虑以下测试:

>>> from timeit import timeit
>>> timeit('create_matrix(particle_id=None)', setup='def create_matrix(particle_id=None):\n    if particle_id:\t        return particle_id\n    else: return None', number=10000000)
1.3292641180877212  # if statement with particle_id defaulting to None
>>> timeit('create_matrix(particle_id=5)', setup='def create_matrix(particle_id=None):\n    if particle_id:\t        return particle_id\n    else: return None', number=10000000)
1.5606957465069584  # if statement with particle_id defaulting to 5
>>> timeit('create_matrix(particle_id=5)', setup='def create_matrix(particle_id=None): return None', number=10000000)
1.2185165279484238  # no if statement

在1000万次迭代中,if语句增加了相对较少的时间。最后一个测试排除了if声明。

所以你可以试试这个(正如@Martijn Pieters建议的那样):

def create_matrix(self, particle_id=None):
    if particle_id is not None:
        ...