2016-03-30 5 views
11

आरईपीएल में, हम आमतौर पर एक सिग्ंट के साथ एक अनंत लूप को बाधित कर सकते हैं, यानी ctrl + सी, और दुभाषिया में नियंत्रण प्राप्त करें।मैं इस itertools अनंत लूप से क्यों नहीं टूट सकता?

>>> while True: pass 
... 
^CTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyboardInterrupt 
>>> 

लेकिन इस लूप में, बाधा अवरुद्ध प्रतीत होती है और मुझे बचने के लिए मूल प्रक्रिया को मारना है।

>>> *x, = itertools.repeat('x') 
^C^C^C^C^C^C^C^C^\^\^\^\^\^Z^Z^Z^Z 

वह क्यों है?

+0

पायथन ट्रैकर में प्रासंगिक बग: http://bugs.python.org/issue26351 –

उत्तर

10

KeyboardInterrupt प्रत्येक पायथन निर्देश के बाद चेक किया गया है। itertools.repeat और टुपल पीढ़ी को सी कोड में संभाला जाता है। अंतराल को बाद में संभाला जाता है, यानी कभी नहीं।

+1

दरअसल। 'सूची (itertools.repeat (' x '))' दुभाषिया को भी लटकती है, लेकिन इसे पृष्ठभूमि में डालकर और एक सादा 'टीईआरएम' संकेत भेजकर दुभाषिया को सही ढंग से मार देता है। –

+0

बग या सुविधा? – wim

+4

@ विम: http://bugs.python.org/issue26351 देखें। –

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