在python中构造重复的import语句

时间:2019-05-20 22:17:09

标签: python python-import

我有一个带有许多.py脚本的Python项目。大多数脚本与类似的import语句很像。构造此类进口的一般惯例是什么?

  1. 是否会在每个.py文件中重复它们?
  2. 是否会将它们全部列在一个单独的文件中,并将该文件导入每个.py文件中?

如果有帮助,我的导入看起来像这样,还有更多。

import datetime
import logging
import random
import sys
import os
import operator
import warnings

import json
import numpy as np
import parseJSON
import pandas as pd


 from sklearn.svm import SVC
 from sklearn import svm
 from sklearn import linear_model

 from sklearn.linear_model import LogisticRegression
 from sklearn.ensemble import GradientBoostingClassifier
 from sklearn.tree import DecisionTreeClassifier
 from sklearn.ensemble.forest import RandomForestClassifier
 from sklearn.ensemble import BaggingClassifier

 from sklearn.multiclass import OneVsRestClassifier
 from sklearn.linear_model import SGDClassifier
 from sklearn import neighbors
 from sklearn.ensemble import RandomForestClassifier
 from sklearn import metrics
 from sklearn.svm import SVC
 from sklearn.naive_bayes import GaussianNB
 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
 from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
 from sklearn.metrics import accuracy_score
 from sklearn.neighbors import KNeighborsClassifier
 from sklearn.svm import SVC
 from sklearn.tree import DecisionTreeClassifier
 from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
 from sklearn.preprocessing import LabelEncoder

2 个答案:

答案 0 :(得分:1)

PEP 8 style guide是此类事情的权威来源。根据您的具体情况,有一个for imports小节,内容如下(强调我的意思):

  

进口应按以下顺序分组:

     

标准库导入。相关第三方进口。本地   应用程序/库特定的导入。你应该留一个空白行   在每组进口之间。

     

建议绝对导入,因为它们通常更易读   并表现得更好...

这将表明最佳实践是按照选项(1)中所述进行操作。

作为一个轶事,如果我(或您)必须在将来编辑一个.py文件,我希望以预期的格式查看每个导入,因此无论我打开哪个脚本文件,我都知道依赖项< / p>

答案 1 :(得分:1)

我建议将文件需要的导入放置在该文件中。如果恰好在几个文件中都需要一个模块-没关系。 Python仅加载一次模块。我发现唯一值得注意的是在自定义模块中导入了相同的模块,而main(main也导入了我的自定义api模块)是在检查异常时:

我的api.py有import pycurl 我的main.py有import api 而且它以前也有import pycurl

我能够识别pycurl异常,例如

...
except pycurl.error as e:

后来我从main.py中删除了pycurl的导入 并且上面的代码不再起作用。相反,我必须这样做:

...
except api.pycurl.error as e:

希望这会有所帮助

编辑: 您从sklearn导入了很多内容,有些重复了。尽管不是很关键,但这确实会妨碍代码的可读性。也许您应该只自己导入sklearn,然后在类似sklearn.naive_bayes.GaussianNB的代码中调用它的组件,这将带来额外的好处,即在代码中显示哪些对象属于sklearn,但要花更多的时间。 / p>