我一直在阅读有关kwargs和args的内容,但在这种情况下我真的很难实现它们。
我有一个类的对象
a = MDFile()
有一个方法
a.create_matrix()
将返回n×m矩阵,其中n是MDFile中的粒子数。如果用户没有为方法指定任何参数,我希望它返回完整的n乘m矩阵。但是如果用户指定一个粒子数 - 比如他们只想要第五个粒子的信息,我希望他们能够做到:
a.create_matrix(particle_id=5)
并且它将仅返回矩阵的相应行,然后将是1xm数组。
如何使用kwargs和args实现这一目标?或者有更好的替代方法吗?似乎args需要某种默认值,我真的不想要。我也不太希望使用if语句分散方法,因为它会严重降低性能。
答案 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:
...