关于 Python 的导入

2018-04-12 15:01:09 +08:00
 alvy

我在某个文件里需要用到 contract.serializers.contract_serializers 里的 PurchaseSerializer
那么我有两种写法:

import contract.serializers.contract_serializers
a = contract.serializers.contract_serializers.PurchaseSerializer(instance)

这一种层级太长了,写起来很不方便

from contract.serializers.contract_serializers import PurchaseSerializer
a = PurchaseSerializer(instance)

这一种写法看着很好
但是我有个疑问是:在[编写高质量代码:改善 Python 程序的 91 个建议](编写高质量代码:改善 Python 程序的 91 个建议)这本书里,提到了:要有节制的使用from ... import ...
而且如果两个文件有相互导入,使用from ... import ...大概率会报import error的错

那么应该怎么导入呢?

3493 次点击
所在节点    Python
20 条回复
wizardforcel
2018-04-12 15:03:03 +08:00
为啥要相互导入。。

你见过哪个语言允许相互导入?
yeyuexia
2018-04-12 15:04:14 +08:00
好几个月没写 python 了,现在如果两个文件有相互导入 用 import 就不会报 import error 的错了????????????????
a33486
2018-04-12 15:05:05 +08:00
有种导入方法叫__important__("contract.serializers.contract_serializers").PurchaseSerializer 可以试一试 这种导入方法模块和函数全部要自己打比较麻烦 而且只能导入一次 我现在刚入门 在想这种导入方法跟 from important 之间的性能区别呢
takato
2018-04-12 15:09:44 +08:00
import contract.serializers.contract_serializers as ooxx
a = ooxx.PurchaseSerializer(instance)
yeyuexia
2018-04-12 15:12:49 +08:00
233 刚才查了下 还真可以,我还真是太无知了哈哈哈
alvy
2018-04-12 15:36:07 +08:00
@wizardforcel 相互导入是不对,但是实际情况的确会遇到
alvy
2018-04-12 15:44:31 +08:00
@takato 这样导入如果是相互导入的话也会报错,因为 as 会执行,然后就报错了
takato
2018-04-12 15:45:21 +08:00
@alvy 循环导入是要从代码结构上解决的问题哦。。
ipwx
2018-04-12 15:46:32 +08:00
在函数或者类成员函数里面导入,是可以突破循环导入的限制的。
bookding0
2018-04-12 15:49:19 +08:00
用 from xx import xx。
循环导入是另一个问题。
alvy
2018-04-12 15:55:27 +08:00
@ipwx 没错,但是我就要在顶部导入呢
scriptB0y
2018-04-12 16:02:46 +08:00
如果实际情况出现,只能说明项目的设计有问题,换任何语言都有问题。
gnozix
2018-04-12 16:48:44 +08:00
import as 了解一下
Akikiki
2018-04-12 17:09:05 +08:00
@yeyuexia flask 相互导入的好像比较常见
wizardoz
2018-04-12 17:54:48 +08:00
用的地方再导入,就基本上不存在循环导入的问题。
noai
2018-04-12 17:56:30 +08:00
@wizardoz 嗯嗯
ox180
2018-04-12 19:21:21 +08:00
@Akikiki 你举个例子
Wicked
2018-04-12 23:12:30 +08:00
import as
wqzjk393
2018-04-13 01:46:10 +08:00
…刚好今天看 flask 讲到分文件导致的注册路由模块和主模块之间的循环导入,然后使用蓝本解决 23333
kysida
2018-04-13 10:45:23 +08:00
试试 import from as ????

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX