2014-01-11 41 views
0

我一直在閱讀關於kwargs和args的一些信息,但是我很努力的在這種情況下如何實現它們。Python args和kwargs爭論混淆

我有一個類

a = MDFile() 

其具有方法

a.create_matrix() 

其中n是在MDFile顆粒的數量將由米矩陣返回n的對象。如果用戶沒有爲該方法指定任何參數,我希望它返回完整的n乘m矩陣。但是,如果用戶指定的粒子數 - 說,他們只希望參加第五屆粒子的信息,我希望他們能夠做到:

a.create_matrix(particle_id=5) 

,它只會返回矩陣的相應行,這將然後是1xm數組。

如何使用kwargs和args來實現此目的?還是有更好的替代方法來做到這一點?看起來args需要某種默認值,我並不是很想要。我也不太想要if語句散佈的方法,因爲它會嚴重降低性能。

+2

到底是什麼毛病'高清create_matrix(個體經營,particle_id =無)'然後'如果particle_id不無測試: '? –

+0

我可以做到這一點,但後來我在方法中有一個if語句。這當然是一種選擇,但我想避免這種情況,因爲我將在數百萬個影響性能的文件上使用這種方法相當困難。 – user1654183

+1

好吧,如果你想根據參數改變行爲,你將**擁有**來使用if語句。 –

回答

3

我認爲@Martijn彼得斯是正確的。您將不得不使用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 

月10百萬次迭代中,if語句添加比較少的時間。最後的測試不包括if聲明。

所以,你可以試試這個代替(如@Martijn皮特斯建議):

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

'如果particle_id:'似乎是一個不好的建議,因爲我猜想可以期待'particle_id'等於'0',它將強制爲布爾型'False'。我建議明確的'如果particle_id不是None'。正如一位智者所說,明確優於暗示;) – alko

+0

@alko優秀點。我編輯了答案。謝謝。 –