Python(和Django)最佳导入做法

发布于 2021-01-29 15:16:08

在导入代码的各种方式中,有没有比其他方式更可使用的方式?此链接http://effbot.org/zone/import-
confusion.htm
简短说明

from foo.bar import MyClass

在通常情况下或除非您知道自己在做什么,否则不是导入MyClass的首选方法。(相反,更好的方法是:

import foo.bar as foobaralias

然后在代码中访问MyClass使用

foobaralias.MyClass

简而言之,似乎上面提到的链接表示 通常 最好从模块中导入所有内容,而不是仅导入模块中的一部分。

但是,我链接的那篇文章真的很老。

我还听说,至少在Django项目的上下文中,最好只导入要使用的类,而不是整个模块。据说这种形式有助于避免循环导入错误或至少使django导入系统不那么脆弱。有人指出,Django自己的代码似乎更喜欢“
from x import y”而不是“ import x”。

假设我正在从事的项目未使用…的任何特殊功能__init__.py(我们的所有__init__.py文件均为空),我应该采用哪种导入方法,为什么?

关注者
0
被浏览
63
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    对我来说,这取决于情况。如果它是一个唯一命名的方法/类(即不是/不是process()这样的东西),并且您将要 大量
    使用它,则保存输入内容,然后执行即可from foo import MyClass

    如果要从一个模块导入多个内容,则最好只是导入该模块,然后执行domodule.bar, module.foo, module.baz等以保持名称空间整洁。

    你也说过

    据说这种形式有助于避免循环导入错误或至少使django导入系统不那么脆弱。有人指出,Django自己的代码似乎更喜欢“ from x import
    y”而不是“ import x”。

    我不知道一种方式或另一种方式将有助于防止循环进口。原因是,即使执行此操作from x import y,也将全部x导入。仅y将其带入当前名称空间,但整个模块x都将处理。试试这个例子:

    在test.py中,输入以下内容:

    def a():
        print "a"
    
    print "hi"
    
    def b():
        print "b"
    
    print "bye"
    

    然后在“ runme.py”中输入:

    from test import b
    
    b()
    

    然后就做 python runme.py

    您将看到以下输出:

    hi
    bye
    b
    

    因此,即使您仅导入了test.py中的所有内容,b



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看