كيف يمكنني تضمين Ipython مع تعبيرات مولد العمل؟
سؤال
لا تعمل بعض الشمولية القائمة بشكل صحيح عندما قمت بتضمين Ipython 0.10 وفقًا للتعليمات. ما الذي يحدث مع مساحة اسمي العالمية؟
$ python
>>> import IPython.Shell
>>> IPython.Shell.IPShellEmbed()()
In [1]: def bar(): pass
...:
In [2]: list(bar() for i in range(10))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/<ipython console>
/tmp/<ipython console> in <generator expression>([outmost-iterable])
NameError: global name 'bar' is not defined
المحلول 2
يبدو أنه يعمل ، لكن Ipython يعتقد أنه البرنامج الرئيسي. لذلك بعد إنشاء Ipshell ، يظهر تصادم "يصيح ، تحطمت Ipython".
import IPython.Shell
ipshell = IPython.Shell.IPShell(argv=[], user_ns={'root':root})
ipshell.mainloop()
نصائح أخرى
القائمة على ما يرام ، هذا يعمل:
[bar() for i in range(10)]
إنها تعبيرات مولد (وهو ما انتقلت إلى ذلك list()
المكالمة) هذا ليس على ما يرام:
gexpr = (bar() for i in range(10))
list(gexpr)
الفرق: يتم تقييم العناصر في القائمة الفهم في وقت التعريف. يتم تقييم العناصر الموجودة في تعبير المولد عندما next()
يسمى (على سبيل المثال من خلال التكرار عندما تنقلها إلى list()
) ، لذلك يجب أن تحتفظ بالإشارة إلى النطاق الذي يتم تعريفه فيه. يبدو أن مرجع النطاق يتم التعامل معه بشكل غير صحيح ؛ على الأرجح هذا ببساطة خطأ ipython.
لا تنتمي إلى StackOverflow