對於Python 3.6,the keyword argument order is preserved的。在3.6之前,這是不可能的,因爲OrderedDict
變成了dict
。
實現的第一件事是,你在**example
傳遞值不會自動成爲**kwargs
值。考慮這種情況下,如果kwargs
只會有example
部分:
def f(a, **kwargs):
pass
example = {'a': 1, 'b': 2}
f(**example)
或者這種情況下,在那裏將有更多的價值比那些例子:
example = {'b': 2}
f(a=1, c=3, **example)
甚至沒有重疊可言:
example = {'a': 1}
f(b=2, **example)
所以,你問什麼,並沒有真正意義。
不過,如果有一些方法來指定要有序**kwargs
,不管它可能是好的,其中的關鍵字從-明確的關鍵字ARGS中出現的順序來了,然後是所有的項目**example
按它們在example
中出現的順序排列(如果example
是dict
,則這可能是任意的,但如果它是OrderedDict
,也可能是有意義的)。
定義所有的煩雜細節,並保持表現可接受,結果比聽起來更難。請參閱PEP 468以及鏈接的線索,瞭解關於該想法的一些討論。這段時間似乎停滯不前,但是如果有人拿起並且支持它(並且寫一個參考實現供人們使用 - 這取決於從C API可訪問的OrderedDict
,但是希望在3.5+ ),我懷疑它最終會融入語言。
順便說一句,注意,如果這個爲可能,這將幾乎肯定會在構造函數用於OrderedDict
本身。但是,如果你嘗試,你正在做的是凍結一些任意順序作爲永久順序:
>>> d = OrderedDict(a=1, b=2, c=3)
OrderedDict([('a', 1), ('c', 3), ('b', 2)])
同時,你有什麼選擇?
那麼,顯而易見的選擇就是通過example
作爲一個正常的參數,而不是拆包:
def f(example):
pass
example = OrderedDict([('a', 1), ('b', 2)])
f(example)
或者,當然,你可以使用*args
並將項目傳遞元組,但是這通常醜陋。
從PEP鏈接的線程中可能會有一些其他的解決方法,但實際上,它們都不會比這更好。 (除了...... IIRC,李浩義提出了一個基於他的MacroPy的解決方案來傳遞保留順序的關鍵字參數,但我不記得細節。如果你願意使用MacroPy並編寫代碼,MacroPy的解決方案通常很棒它不完全像Python一樣閱讀,但並不總是合適的......)
感謝您的詳細答覆。我最終做的是允許一個可選的第一個參數(一個有序的詞典),如果提供的話,將優先使用** kwargs。偉大的信息,雖然 – theodox 2014-11-05 16:30:18
**另請參閱:** https://duckduckgo.com/?q=pep468 – dreftymac 2017-04-06 11:55:20