2014-06-10 47 views

回答

3

有兩種方法來控制*運營商的行爲,當它被用於這樣的:

  1. 超載的__iter__ special method

    >>> class C(object): 
    ...  def __init__(self, lst): 
    ...   self.lst = lst 
    ...  def __iter__(self): 
    ...   return iter(self.lst) 
    ... 
    >>> def f(a, b, c): 
    ...  print "Arguments: ", a, b, c 
    ... 
    >>> c = C([1, 2, 3]) 
    >>> f(*c) 
    Arguments: 1 2 3 
    >>> 
    
  2. 超載的__getitem__ special method

    >>> class C(object): 
    ...  def __init__(self, lst): 
    ...   self.lst = lst 
    ...  def __getitem__(self, key): 
    ...   return self.lst[key] 
    ... 
    >>> def f(a, b, c): 
    ...  print "Arguments: ", a, b, c 
    ... 
    >>> c = C([1, 2, 3]) 
    >>> f(*c) 
    Arguments: 1 2 3 
    >>> 
    
+0

一個序列對象也可以工作(實現'__getitem__')。 –

1

人們稱之爲"positional expansion「或參數解包。您的實例應提供__iter__方法,該方法在迭代此對象時調用。不過,我認爲最簡潔的方法是子類collections.Iterable,它是Python中所有迭代的抽象基類。

請注意,this是關鍵字參數解包的相同問題,要求該對象爲映射。

編輯:我仍然試圖找到確切的實現在這種情況下,看看哪些C API調用是用於解包。這將產生這個問題的確切答案。任何指針?

1

您可以執行此操作的一種方法是子類tuplelist

相關問題