我已经注意到在Python代码中,通常首选明确导入所需模块的部分,例如
from django.core.urlresolvers import reverse
from django.db import models
但是,我注意到Python标准库模块的情况似乎并非如此,我通常会看到,例如:
import os
import sys
something = os.path.join('home', 'ludo')
other = sys.argv('dunno')
而不是
from os.path import join
from sys import argv
something = join('home', 'ludo')
other = argv('dunno')
这是否有任何推理或记录的约定?
答案 0 :(得分:7)
关于这个问题holy style guide非常宽松:
从包含类的模块导入类时,通常是这样 好吧拼写这个:
from myclass import MyClass from foo.bar.yourclass import YourClass
如果此拼写导致本地名称冲突,则拼写它们
import myclass import foo.bar.yourclass
并使用“myclass.MyClass”和“foo.bar.yourclass.YourClass”。
对此没有任何“规则”,只是如上所述的一些指示。如果您不受阻碍,例如名字冲突,你可以随意做。
但是,如链接中所述,您应该记住
应该避免使用通配符导入(来自import *) 不清楚命名空间中存在哪些名称,令人困惑 读者和许多自动化工具。
答案 1 :(得分:1)
与Tim Castelijns相关'回答,这也是一个可以接受的选择:
from my_module import models as my_models
from their_module import models as their_models
class MyOtherModel(their_models.Foo):
...
class MyThirdModel(my_models.Bar):
...
也就是说,您可以为导入的模块分配替代名称。但是,您必须牢记可读性,因此请确保参考哪个模块仍然清晰。
例如,从其他模型派生类时,您可以这样做:
# in myproject.views
from shop.views.cart import CartDetails as ShopCartDetails
class CartDetails(ShopCartDetails):
# my overridden methods
...
它使您有机会在urls.py
导入时引用相同的班级名称:
# in myprojects.urls
from myproject.views import CartDetails
...
url(r'^cart/$', CartDetails.as_view(), name='cart'),
...
答案 2 :(得分:0)
大多数人会使用PEP8风格指南: https://www.python.org/dev/peps/pep-0008/#imports