मुझे लगता है कि आप सीपीथन का उपयोग कर रहे हैं और एक और पायथन कार्यान्वयन नहीं कर रहे हैं। और मैं इस मुद्दे को सीपीथन 3.6.1 के साथ पुन: पेश कर सकता हूं (मेरे पास पीपीपी, ज्योथन, आयरनपीथन नहीं है ... इसलिए मैं इन्हें जांच नहीं सकता)।
इस मामले में अपराधी callable_iterator.__next__
की सी बराबर में _PyObject_CallNoArg
साथ PyObject_Call
के प्रतिस्थापन है विधि (अपने वस्तु एक callable_iterator
है)।
PyObject_Call
एक नया datetime.datetime
उदाहरण वापसी करता है, जबकि _PyObject_CallNoArg
रिटर्न NULL
(जो मोटे तौर पर पायथन में एक अपवाद के बराबर है)।
CPython स्रोत कोड के माध्यम से थोड़ा खुदाई:
_PyObject_CallNoArg
सिर्फ _PyObject_FastCall
के लिए एक मैक्रो जो बारी में _PyObject_FastCallDict
के लिए एक मैक्रो है।
This _PyObject_FastCallDict
function चेकों समारोह के प्रकार (C
समारोह या अजगर समारोह या कुछ और) इस मामले क्योंकि datetime.now
एक सी समारोह है में _PyCFunction_FastCallDict
करने और प्रतिनिधियों।
datetime.datetime.now
के बाद से यह चौथी case
में समाप्त होता है लेकिन वहाँ _PyStack_UnpackDict
रिटर्न NULL
और समारोह भी कहा जाता है कभी नहीं है METH_FASTCALL
झंडा है।
मैं वहां रुक जाऊंगा और पाइथन देवों को पता चल जाएगा कि वहां क्या गलत है। @ मार्टिजन पीटर्स ने पहले ही एक बग रिपोर्ट दायर की है और वे इसे ठीक कर देंगे (मुझे उम्मीद है कि वे जल्द ही इसे ठीक करेंगे)।
तो यह एक बग है जिसे उन्होंने 3.6 में पेश किया है और जब तक यह तय नहीं हो जाता है, आपको यह सुनिश्चित करने की आवश्यकता है कि विधि CFunction
METH_FASTCALL
ध्वज के साथ नहीं है। कामकाज के रूप में आप इसे लपेट सकते हैं।संभावनाओं के अलावा @ मार्टिजन पीटर्स ने उल्लेख किया कि एक सरल भी है:
def now():
return datetime.datetime.now()
j = iter(now, None)
next(j) # datetime.datetime(2017, 5, 31, 14, 23, 1, 95999)
दिलचस्प, मैं यह काम करने की अपेक्षा करता हूं। यह 3.4 और 3.5 में भी काम करता है। –
यह तब काम करता है जब आप 'datetime.datetime.now' को 'lambda: datetime.datetime.now()' या 'आंशिक (datetime.datetime.now)' के साथ बदलते हैं। –
मुझे लगता है कि आपको इसकी रिपोर्ट [बग ट्रैकर] (https://bugs.python.org/) पर करनी चाहिए। – MSeifert