Python Imports Convention

时间:2015-05-01 12:24:54

标签: python

我已经注意到在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')

这是否有任何推理或记录的约定?

3 个答案:

答案 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