在Python中,导入类与导入类的模块有什么优缺点?

2023-12-29

我正在为大约 30 名开发人员组成的团队编写一套 Python 编码指南。作为我的文档的基础,到目前为止我已经研究了谷歌Python风格指南 http://google-styleguide.googlecode.comPEP 8 风格指南 http://www.python.org/dev/peps/pep-0008/,并合并了两者的信息。

Google 风格指南比 PEP 8 限制更多的地方是导入。 Google 指南要求开发人员仅导入包和模块,然后通过更合格的名称引用其中的项目。例如:

from pkg import module
...
my_class = module.MyClass()

理由是“每个标识符的来源都以一致的方式指示”。对于我们的项目,我们打算组织两层或三层深度的包,因此要了解标识符的完整来源,读者可能需要检查导入语句。我想提倡这种导入风格作为“首选风格”:

from pkg.module import MyClass
...
my_class = MyClass()

恕我直言,当名称更简洁时,Python 结构(例如列表理解)的可读性会得到提高。

我不清楚 python 解释器在幕后可能做什么。例如,MyClass 现在是该模块以及该模块的所有导入器的全局命名空间的一部分吗? (这会很糟糕,可能会导致一些奇怪的错误;如果这是真的,我会提倡 Google 风格)。

我的Python开发经验仅限于6个月左右(而且我们的项目没有太多专家可以咨询),所以我想从社区获取更多信息。以下是我已经研究过的一些项目:

effbot - 关于进口的讨论 http://effbot.org/zone/import-confusion.htm

堆栈溢出 - 导入与从导入 https://stackoverflow.com/questions/9439480/from-import-vs-import

python 文档 - 模块 http://docs.python.org/2/tutorial/modules.html

python 文档 - 导入 http://docs.python.org/2/reference/simple_stmts.html#import

谢谢你的回复!


在 Python 中,不存在跨多个模块的全局变量这样的东西。如果你这样做from pkg.module import MyClass, then MyClass位于您执行此操作的模块的全局命名空间中,但不在任何其他模块的全局命名空间中(包括导入导入 MyClass 的模块的模块)。

至于您更普遍的问题,根据具体情况,任何一种导入机制都可以接受。如果模块名称很长,您可以通过以不同的名称导入它来缩短它:

# Awkward
from package import reallylongmodule
reallylongmodule.MyClass()

# Less awkward
from package import reallylongmodule as rlm
rlm.MyClass()

如果类名足够独特,您可以知道它来自哪里以及它是什么,则仅导入类就可以了。但是,如果您有多个模块定义具有相对不具有描述性的名称的类(例如“处理器”、“单元”、“数据”、“管理器”),那么最好通过模块名称访问它们以澄清你在做什么。

风格指南最终只是指南,而不是法律。我自己的偏好是选择一种最大限度提高清晰度和可读性的机制。这涉及到避免长而繁琐的名称和避免短、模糊或神秘的名称之间的权衡。如何进行这种权衡取决于您正在使用的特定库以及您如何使用它们(例如,您导入了多少个模块,您从它们导入了多少内容)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中,导入类与导入类的模块有什么优缺点? 的相关文章

  • Spark 请求最大计数

    我是 Spark 的初学者 我尝试请求允许我检索最常访问的网页 我的要求如下 mostPopularWebPageDF logDF groupBy webPage agg functions count webPage alias cntW
  • 围绕 readline 构建的 python 批处理的触发器选项卡完成

    背景 我有一个 python 程序 它导入并使用 readline 模块来构建自制的命令行界面 我有第二个 python 程序 围绕 Bottle 一个 Web 微框架构建 充当该 CLI 的前端 第二个 python 程序向第一个程序打开
  • 我怎样才能更多地了解Python的内部原理? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我使用Python编程已经有半年多了 我对Python内部更感兴趣 而不是使用Python开发应用程序
  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • 填充两个函数之间的区域

    import matplotlib pyplot as plt import numpy as np def domain x np arange 0 10 0 001 f1 lambda x 2 x x 2 0 5 plt plot x
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • 在 pytube3 中获取 youtube 视频的标题?

    我正在尝试构建一个应用程序来使用 python 下载 YouTube 视频pytube3 但我无法检索视频的标题 这是我的代码 from pytube import YouTube yt YouTube link print yt titl
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • Python 无法使用套接字绑定我的外部/公共 IP 地址,给出错误但是当使用本地 IP 地址时,错误不会显示

    这是出现主要错误的代码 与我的本地 IP 的绑定将起作用 s bind 192 168 1 4 port 与我的公共 IP 的绑定失败并出现以下错误 s bind 99 99 99 99 port WinError 10049 请求的地址在
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f

随机推荐

  • SQL返回不在表中的随机数

    我有一个包含 user ids 的表 该表是我们从活动帐户的流数据源中收集的 现在我正在查看并填写有关 user ids 的信息 但这些信息不做任何事情 是否有一种 SQL postgres 如果重要的话 方法可以让查询返回表中不存在的随机
  • 如何将 Eclipse jdt jar 库放入 Java 构建路径中?

    我正在尝试使用 eclipsejdt 我尝试在java源文件中导入相关模块 我有很多错误 因为 jdt 库不在 Java 构建路径中 我尝试打开Add Libary gt Plug in Dependencies 但它没有 jdt jar
  • 打开Matlab保存的.fig文件的程序

    有没有任何程序可以打开Matlab保存的 fig文件 更新 29 04 2016 根据johnml1135 的回答 https stackoverflow com a 36923358 2140414 fig 文件本质上只是 mat 文件
  • 如何使用 Opencv 和 python 播放网络视频

    我正在寻找简单地使用 opencv 开发一些东西 我希望使用 opencv 从网络上播放视频 就像您可以通过传递位置路径来播放笔记本电脑上的视频一样 现在尝试传递视频 url 并让它播放 到目前为止我正在获取错误任何建议都会很好 impor
  • 如何让 jQuery .get 返回 JSON 数据?

    我正在尝试使用 AJAX 从 URL 获取信息 此 URL 将返回 JSON 响应 但我在使其正常工作时遇到了很大的麻烦 我对使用 AJAX 和 JSON 相当陌生 所以我不太确定我做错了什么 我没有收到任何输出 这是我到目前为止所拥有的
  • 我需要有关此 C++ 算法的一些帮助

    我正在尝试解决算法问题 但找不到解决方案 任务是输出达到某种灯配置所需的最少步骤数 有两行灯和 N 11011 11011 or 11101101111000101010 01111101100000010100 这些灯可以 开 1 或 关
  • html 5 视频是在页面加载时缓冲还是仅在播放视频时缓冲?

    如果我想在页面上嵌入 20 个视频 它们会在页面加载时开始缓冲 还是会等到第一次播放 交互 如果它们在加载时缓冲 我如何才能避免这种情况 直到我想显示视频 我不希望用户在只观看一个甚至根本不观看的情况下缓冲 20 个视频 您正在查看的是pr
  • 如何从 suds 响应中获取未解析的 XML,以及用于存储的最佳 django 模型字段

    我正在使用 suds 使用 wsdl 向第三方请求数据 我现在只保存一些返回的数据 但我正在为获得的数据付费 所以我想保留所有数据 我决定保存此数据的最佳方法是将原始 xml 响应捕获到数据库字段中 以便将来在我决定开始使用数据的不同部分时
  • Rust 目标组件的源代码在哪里?

    当我跑步时 rustup target install wasm32 unknown unknown 它指出 info downloading component rust std for wasm32 unknown unknown 这意
  • Eclipse Europa 搜索引用功能停止工作

    我正在使用 JDK 1 5 0 12 在 MS Windows 2000 SP4 上使用 Eclipse 版本 3 2 1 Build M20060921 0945 我采用 es AR 语言环境 并用我不喜欢的西班牙语设置所有菜单和上下文
  • 如何从 Maven 3.0 插件获取本地存储库位置?

    如何从 Maven 3 x 插件中获取本地存储库位置 URI 按照中所述使用以太这篇博文 http www sonatype com people 2011 01 how to use aether in maven plugins The
  • 代理后面的 git Push 远程问题

    为了设置上下文 我尝试使用toto https github com cloudhead toto建立我的博客 我做到了 sudo gem install toto 并且宝石安装正确 Successfully installed rdisc
  • Android ADB 连接空主机名

    我使用 ADB over WiFi 连接到 Android 设备 当我打字时 adb connect
  • java.lang.ClassNotFoundException:javax.ws.rs.client.RxInvokerProvider

    我尝试使用 loginServlet 从 jsp 页面登录 它重定向到 servlet 但不进行身份验证并引发错误 这是代码 JSP 文件 div class container div class row div class box di
  • Powershell:如何将结果添加到数组(ForEach-Object -Parallel)

    我知道 用参数 using foo我可以在运行时使用来自不同运行空间的变量ForEach Object Parallel在 Powershell 7 及更高版本中 但是如何将结果添加回变量呢 常用参数 and using 不管用 例如 Al
  • 如何向 pandas 数据框添加额外的行[重复]

    这个问题在这里已经有答案了 如果我有一个空数据框 columns Date Name Action ID df pd DataFrame columns columns 有没有办法向这个新创建的数据框追加新行 目前我必须创建一个字典 填充它
  • 我可以从网格生成点云吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试从网格生成点云数据 例如 Maya 的 obj 文件 但是 我只能在互联网上找到相反的情况
  • 我如何给此列表中的每个人加薪

    需要使用 for each 循环 每个人获得的加薪是 1000 会是这样吗 int raise 1000 for Person i people people add raise i 我正在处理这个 public ArrayList
  • C 中的多字节整数变量[重复]

    这个问题在这里已经有答案了 我想知道如何计算单引号中字符串的整数值 我的示例代码是 include
  • 在Python中,导入类与导入类的模块有什么优缺点?

    我正在为大约 30 名开发人员组成的团队编写一套 Python 编码指南 作为我的文档的基础 到目前为止我已经研究了谷歌Python风格指南 http google styleguide googlecode com和PEP 8 风格指南