작업 발전기 표현식에 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을 인스턴스화 한 후 충돌이 "Whoops, 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