【问题标题】:Structuring repeated import statements in python在python中构造重复的导入语句
【发布时间】:2019-05-20 22:17:08
【问题描述】:

我有一个包含许多 .py 脚本的 Python 项目。大多数脚本都有类似的导入语句。构建此类进口的一般惯例是什么?

  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

【问题讨论】:

  • 第一个版本 - 当您打开文件时,您会看到所有需要的模块。
  • @furas,谢谢,快速澄清一下——我的每个文件中都会有大约 20-30 行导入语句。可以吗?

标签: python python-import


【解决方案1】:

此类事情的最终来源是PEP 8 style guide。具体到你的情况,有一个小节for imports,如下(强调我的):

进口应按以下顺序分组:

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

建议使用绝对导入,因为它们通常更具可读性 并且往往表现得更好......

这表明最佳做法是按照您在选项 (1) 中所述进行操作。

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

【讨论】:

    【解决方案2】:

    我建议将文件需要的导入放在该文件中。如果在多个文件中碰巧需要一个模块 - 没关系。 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,但会花费更多的输入。

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 2011-11-11
      • 1970-01-01
      • 2018-12-06
      • 2014-03-04
      • 2023-02-15
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      相关资源
      最近更新 更多