あなたはCPythonを使用していて、別のPython実装ではないと仮定します。そして、私はCPython 3.6.1でこの問題を再現できます(私はPyPy、Jython、IronPythonを持っていないので、これらはチェックできません)。
この場合の犯罪者は、(あなたのオブジェクトはcallable_iterator
)のCに相当するのPyObject_Call
で置き換えられます。
PyObject_Call
はdatetime.datetime
インスタンスを返しますが、_PyObject_CallNoArg
はNULL
(これはPythonの例外とほぼ同じです)を返します。
_PyObject_CallNoArg
が順番に_PyObject_FastCallDict
マクロある_PyObject_FastCall
ためだけのマクロがある:CPythonのソースコードを介してビットを掘る
。
This _PyObject_FastCallDict
functionチェック関数(C
-functionまたはPython関数または何か)の種類及び委任この場合_PyCFunction_FastCallDict
からdatetime.now
は、C関数であるからです。 datetime.datetime.now
以来
は、それが第四case
で終わるMETH_FASTCALL
フラグを持っていますが、そこ_PyStack_UnpackDict
戻りNULL
と機能であっても呼び出されることはありません。
私はそこで停止し、Pythonの開発者に何が間違っているのか理解させてもらいます。 @Martijn Pietersは既にBugレポートを提出しており、修正する予定です(私はただちに修正することを願っています)。
これは3.6で導入されたバグです。固定されるまでは、CFunction
にMETH_FASTCALL
フラグが設定されていないことを確認する必要があります。回避策として、それをラップすることができます。可能性を除けば@Martijn Pietersもシンプルです:
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() 'または' partial(datetime.datetime.now) 'に置き換えると動作します。 –
私はあなたの[バグトラッカー](https://bugs.python.org/)でこれを報告すべきだと思います。 – MSeifert