作者sheauhei ( )
看板Python
标题Re: [问题] from xxx import ooo
时间Tue Oct 23 21:45:04 2012
: 但如果你今天的档案内容如下:
: test.py: <- 程式进入点
: import a
: a.py:
: class xx():
: pass
: from b import yy
: b.py:
: from a import xx
: class yy():
: pass
:
: 你会发现exception就没了,而且可以正常运作。
: 因为当b试图from a import xx,
: 这时因为xx已经产生了,所以没问题。
:
: 但写出a import b, b import a这样的code,
: 也不太好就是了 orz.
: 避免这样写还是正确的方式 :)
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 118.163.84.235
: 推 whitefur:PUSH~~ 10/23 14:09
: ※ 编辑: sheauhei 来自: 139.175.68.252 (10/23 15:37)
: 推 keitheis:感谢详解,原来还有绕道的解法 XD 10/23 19:32
: → keitheis:不过不建议没写在开头的 import;不然要非常小心的使用 10/23 19:34
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这说法个人有点其他想法,算借题发挥吧 :p
如果指的是上述例子为了绕过import exception的问题,
而延迟了import的时间点,
这本身做法就是有问题的...可以说是来乱的阿 orz
不过,在一般性来讲,个人建议是:
"尽可能延迟module import的时间点,至到需要用到它。"
一个平常的例子就是,
如果只有在某个function中需要用到某个module,
那最好在function的local namesapce去import,
而不要在global namespace import。
简单的例子
main.py:
import a
...
def executeA():
a.func()
a.py:
import b
def func():
b.xxx() ...
b.py:
....
在这个例子中,executeA()这个function,
可能从头到尾都不会被执行到,
但是却因为它,从main.py开始执行时,
就一路从a.py 一直到 b.py,
甚至更多的module都被import进来。
(如果你目前在做的专案有上千个module,
你就会知道这恐怖了 囧...)
建议是:
main.py:
def executeA():
import a
a.func()
a.py:
def func():
import b
b.xxx() ...
b.py:
...
除非executeA()被执行到,
不然a.py 和 b.py 乃至於其後会用到的module
都不会被load到。
---
这原则的另个好处(?),
就是可以刚好绕过原原po的那种
a import b, b import a问题.... orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.164.18.4
1F:推 juiz:我也支持这个惯例,不过我们违反 PEP8 10/23 23:31
2F:推 keitheis:PEP8: But most importantly: know when to be inconsist 10/24 11:36