كيف يمكنني تضمين Ipython مع تعبيرات مولد العمل؟

StackOverflow https://stackoverflow.com/questions/1639474

  •  08-07-2019
  •  | 
  •  

سؤال

لا تعمل بعض الشمولية القائمة بشكل صحيح عندما قمت بتضمين 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top