2013-03-21 13 views
12

जनरेटर नहीं क्यों निम्नलिखित पायथन कोड एक त्रुटि
TypeError: type object argument after * must be a sequence, not generator
उठाना पड़ता अगर मैं टिप्पणी करते हुए जनरेटर च में पहली (बेकार) लाइन, सब कुछ ठीक काम करता है?लेखन त्रुटि: * के बाद प्रकार वस्तु तर्क एक दृश्य होना चाहिए,

from itertools import izip 

def z(): 
    for _ in range(10): 
     yield _ 

def f(z): 
    for _ in z: pass # if I comment this line it works! (??) 
    for x in range(10): 
     yield (x,10*x,100*x,1000*x) 

iterators = izip(*f(z)) 
for it in iterators: 
    print list(it) 

एनबी। मैं वास्तव में क्या करने की कोशिश कर रहा हूं, एक जनरेटर के साथ, एकाधिक इटरेटर्स लौटाएं (जितना मैं जनरेटर को तर्क के रूप में पास करूंगा)। ऐसा करने का एकमात्र तरीका यह है कि ट्यूपल्स पैदा करना और उन पर izip() का उपयोग करना - मेरे लिए काला जादू।

+0

आप 'मिल सकती है दिलचस्प itertools से tee' ... – Tathagata

+0

' के माध्यम से चलाने के लिए और इससे पहले कि यह इटरेटर नकल कर सकते हैं एक बार सभी तत्वों को संग्रहीत करने के लिए tee', cf दस्तावेज़: https://docs.python.org/3.1/library/itertools.html#itertools.tee। दुर्भाग्यवश कोई जादू नहीं है, और मेरा प्रयास यहां बेवकूफ था। – JulienD

उत्तर

26

यह मनोरंजक है: आप z कॉल करने के लिए भूल गया जब आप इसे f के लिए पारित:

for _ in z: pass # z is a function 

यह एक लेखन त्रुटि उठाया:

iterators = izip(*f(z())) 

तो f से अधिक पुनरावृति करने के लिए एक समारोह वस्तु की कोशिश की

TypeError: 'function' object is not iterable 

पाइथन अंदरूनी पकड़े गए यह एक भ्रमित त्रुटि संदेश के साथ reraised।

# ceval.c 

static PyObject * 
ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk) 
{ 
... 

      t = PySequence_Tuple(stararg); 
      if (t == NULL) { 
       if (PyErr_ExceptionMatches(PyExc_TypeError)) { 
        PyErr_Format(PyExc_TypeError, 
           "%.200s%.200s argument after * " 
           "must be a sequence, not %200s", 
           PyEval_GetFuncName(func), 
           PyEval_GetFuncDesc(func), 
           stararg->ob_type->tp_name); 
... 
+4

दरअसल, http://bugs.python.org/issue4806 – georg

+0

चार साल, वाह देखें। –

+0

ओह बहुत बहुत धन्यवाद! – JulienD

संबंधित मुद्दे