各种导入方式的缺点
在阅读其他人的代码时(这些人使用非常不同的导入风格),我注意到每种风格都存在以下问题:
import modulewithaverylongname
会在后面的代码中加上很长的模块名称(例如concurrent.futures
或django.contrib.auth.backends
),降低了那些地方的可读性。
from module import *
没有让我有机会从语法上看出,例如classA
和classB
来自同一个模块,并且彼此之间有很多关联。这使得阅读代码变得困难。(这种导入可能会遮盖先前导入的名称只是该问题的最小部分。)
from module import classA, classB, functionC, constantD, functionE
会用太多的名称超载我的短期记忆,我需要在脑海中将它们赋值给module
,以便能够有条理地理解代码。
import modulewithaverylongname as mwvln
有时对我来说不太容易记忆。
一个适当的折中方案
基于以上观察,我在自己的代码中开发了以下风格:
如果模块名很短,例如大多数标准库中的包,则import module
是首选样式。
如果我只需要在自己的模块中使用模块中的名称两到三次,则也是首选样式; 在这种情况下,清晰度胜过简洁(“可读性至关重要”)。
在几乎所有其他情况下,import longername as ln
是首选样式。
例如,我可能会import django.contrib.auth.backends as djcab
。
根据上述标准的定义,缩写将经常使用,因此足够容易记忆。
根据"显式优于隐式"规则,只有这两种风格是完全符合Python的。
from module import xx
在我的代码中仍然有时出现。
我在需要的情况下使用它,即使as
格式看起来有些夸张,
最著名的例子是from datetime import datetime
(但如果我需要更多元素,我会使用import datetime as dt
)。
import pandas
和from pandas import DataFrame
都可以。但是第二种形式from pandas import *
通常不推荐使用,因为它会将所有内容都拉入全局命名空间。 - Niklas B.