隐藏包中的模块导入

2024-03-18

我有一个小包,有一些依赖项,例如 pandas 和 gensim。文件结构是这样的

/package
    __init__.py
    agg_clean.py

In the __init__.py文件,我有import agg_clean所以我能够以链式方式访问这些功能,例如:

import package as pkg
pkg.agg_clean.function()

但是,我有一些导入声明agg_clean.py,(熊猫、操作系统等)。当我如上所述进行链式导入时,我还可以访问agg_clean, e.g. pkg.agg_clean.os.listdir()

如何在包导入中隐藏各个模块的导入?


tl;dr: 你不能干净利落。或者更准确地说,你不应该担心这样的事情。

没有namespace collisions在这种情况下,由于 os 模块是在该名称下加载的pkg.agg_clean.os。如果用户想要使用您导入的操作系统包,让他们这样做也没有什么坏处。除此之外,没有good阻止他们这样做的方法。

这里有一些有趣的事情值得记住。获取可以由另一个 python 脚本导入的以下 python 模块:

# module_im_importing.py
import os as _os

__all__ = ["echo"]

name_not_available = 'some_constant_string'

def echo(object):
    pass

如果您的用户使用导入裸模块import module_im_importing,所有定义的变量都可以在其环境中使用module_im_importing.

>>> import module_im_importing
>>> dir()  # Lookup local namespace
['__builtins__', '__doc__', '__name__', '__package__', 'module_im_importing']
>>> dir(module_im_importing)  # See defined items in your package.
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'echo', 'name_not_available', 'os']

如果他们改为from module_im_importing import *(这是不鼓励的),行为有点不同:

>>> from module_im_importing import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'echo']

这会导致文件中定义的名称module_im_importing.py要导入到用户的本地命名空间中。因为我们用过__all__在您的模块中,仅定义在__all__从您的模块导入到用户本地命名空间。例如,如果您定义了一个类似的函数,这可能会污染它们的名称空间echo这与他们可能使用的另一个包冲突。

这就是为什么通配符导入在PEP8 http://legacy.python.org/dev/peps/pep-0008/#imports。来自文档:

Wildcard imports (from <module> import *) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools.

无论如何,请不要为这样的事情担心。如果您的模块的用户不遵循 PEP8,这只是一个问题,并且无论如何他们都应该被告知他们的错误。请记住,在 Python 中,We're all consenting adults here.

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

隐藏包中的模块导入 的相关文章

  • 适用于 Python 3.x 的 Hive 客户端

    是否可以使用 Python 3 x 连接到 hadoop 并运行 hive 查询 我正在使用Python 3 4 1 我发现可以按照这里写的方式完成 https cwiki apache org confluence display Hiv
  • 生成 Flask 中使用的签名会话 cookie 值

    我正在用另一个需要将项目注入会话的 Flask 服务器代理 Flask 服务器 两台服务器具有相同的密钥 因此加密签名将相同 当使用 Flask 和会话时 http 响应包含一个 Set Cookie 标头session text 其中 t
  • Python,将字典存储在数据库中

    在数据库中存储和检索 python 字典的最佳方法是什么 如果您对使用传统 SQL 数据库 例如 MySQL 不是特别感兴趣 您可以研究非结构化文档数据库 其中文档自然映射到 python 字典 例如MongoDB http www mon
  • 将 2D Panda 的 DataFrame 列表转换为 3D DataFrame

    我正在尝试创建一个将标签值保存到 2D DataFrame 的 Pandas DataFrame 这是我到目前为止所做的 我正在使用读取 csv 文件pd read csv并将它们附加到列表中 出于这个问题的目的 让我们考虑以下代码 imp
  • self.__dict__.update(**kwargs) 的风格是好是坏?

    在 Python 中 假设我有一些类 Circle 它继承自 Shape Shape 需要 x 和 y 坐标 此外 Circle 需要半径 我希望能够通过执行类似的操作来初始化 Circle c Circle x 1 y 5 r 3 Cir
  • python - 将cookie添加到cookiejar

    如何在 python 中创建 cookie 并将其添加到 CookieJar 实例 我拥有 cookie 的所有信息 名称 值 域 路径等 但我不想通过 http 请求提取新的 cookie 我尝试了这个 但看起来 SimpleCookie
  • python:UnboundLocalError:赋值前引用的局部变量“open”[重复]

    这个问题在这里已经有答案了 def read lines readFileName readfile txt f open readFileName r contents f read and so on read lines 当我运行这个
  • 自适应支付 API 错误 580001

    我正在 python 中向 paypal 自适应支付 API 发出 PAY 请求 并收到通用错误 id 580001 没有其他信息 headers API credentials for the API caller business ac
  • 进行异步调用时,“yield”在龙卷风中如何工作?

    最近我在学习龙卷风简介 我遇到了以下代码 class IndexHandler tornado web RequestHandler tornado web asynchronous tornado gen engine def get s
  • 如何打印和显示子进程 stdout 和 stderr 输出而不失真?

    也许有人可以帮助我解决这个问题 我在 SO 上看到了许多与此类似的问题 但没有一个问题同时处理标准输出和标准错误 也没有处理像我这样的情况 因此出现了这个新问题 我有一个 python 函数 它打开一个子进程 等待它完成 然后输出返回代码以
  • 保存游戏最高分?

    我使用 pygame 在 python 中制作了一个非常简单的游戏 分数取决于玩家达到的级别 我将级别作为变量称为score 我想在游戏开始或结束时显示顶级 我会更乐意显示多个分数 但我见过的所有其他线程都太复杂 我无法理解 所以请保持简单
  • 枚举上的 random.choice

    我想用random choice on an Enum I tried class Foo Enum a 0 b 1 c 2 bar random choice Foo 但是这段代码失败了KeyError 我怎样才能随机选择一个成员Enum
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio
  • 如何从 IDLE 命令行运行 Python 脚本?

    在 bash shell 中 我可以使用 bash 或 source 手动调用脚本 我可以在 Python IDLE 的交互式 shell 中做类似的事情吗 我知道我可以转到文件 gt gt 打开模块 然后在单独的窗口中运行它 但这很麻烦
  • Pandas:按日历周分组,然后绘制真实日期时间的分组条形图

    EDIT 我找到了一个非常好的解决方案并将其发布在下面作为答案 结果将如下所示 您可以为此问题生成一些示例数据 codes list ABCDEFGH dates pd Series pd date range 2013 11 01 201
  • Python 对列表中的值求和(如果它存在于另一个列表中)

    我有一个列表和一组 a list 1 2 2 1 1 1 b list 1 2 我正在寻找对应 b list 中的项目并将它们从 a list 中的值相加 以便输出为 1 3 2 1 我尝试过的 sum 0 for i in a list
  • 将同一 numpy 数组的两个视图组合成单个视图而不复制数组?

    我有一个大型 2d numpy 数组 我想删除它的子集并处理函数剩下的内容 我需要对许多子集执行此操作 因此理想情况下我不想每次都创建数组的副本 该函数不会更改数组中的任何值 mat np load filename mat 1 mat i
  • 将 .parquet 编码为 io.Bytes

    目标 将 Parquet 文件上传到 MinIO 这需要将文件转换为字节 我已经能够做到这一点了 csv json and txt bytes data to csv encode utf 8 bytes json dumps self d
  • 如何继承并重写 django 模型类来创建 listOfStringsField?

    我想为 django 模型创建一个新类型的字段 它基本上是一个 ListOfStrings 因此 在您的模型代码中 您将具有以下内容 模型 py from django db import models class ListOfString

随机推荐

  • 如何检查两个 Map 对象是否相等?

    我如何检查是否有两个ES2015 地图 https developer mozilla org en US docs Web JavaScript Reference Global Objects Map对象具有相同的集合 key valu
  • 我如何在学说上使用“外键”?

    我正在 symfony2 和原则上制作课程管理系统 我对在学说中使用外键感到困惑 实体 用户 php class User extends BaseUser ORM Id ORM Column type integer ORM Genera
  • 是否可以通过 smtp 通过 bash 脚本发送邮件?

    我有postfix dovecot 我想制作可以使用 SMTP 的 bash 脚本 我不想使用sendmail 是否可以 也许有人有一些代码示例 男孩 当挑战被抛出时 它总是bash就在我的头顶上 bin sh function check
  • 是否需要锁定对 bool 的访问,或者是否过度杀伤力

    我有一个主要设计为 POCO 类的类 具有各种线程和任务可以读取其值 只有其他人偶尔会更新这些值 这似乎是 ReaderWriterLockSlim 的理想场景 问题是 在类中 如果需要线程安全的属性 如果该属性是bool 是不是有点大材小
  • 窗口上的代理

    我想设立一个Proxy当定义了新属性时它会警告我window目的 实际上我想捕获所有全局变量声明 let handler defineProperty target key descriptor console log hey key re
  • 如何在 w3m 终端中使用 Javascript?

    我发现文本浏览器 w3m 在我看来是迄今为止最好的 然而 主要问题是Javascript 当我使用 Stackoverflow 时 我根本看不到评论 我不确定让 Javascript 在终端中存在什么限制 如何为终端启用至少部分 JavaS
  • 在 pthread 中实现 FIFO 互斥体

    我正在尝试实现支持并发插入的二叉树 甚至可能在节点之间发生 但不必为每个节点分配全局锁或单独的互斥体 相反 分配的此类锁的数量应按线程数量使用树 因此 我最终得到了一种锁车队 http en wikipedia org wiki Lock
  • 在 R 中查找特殊字符的第三次出现并删除之前的所有内容

    我有这个包含 URL 的示例向量 我的目标是获取URL的路径 sample1 lt c http tercihblog com indirisu docugard http funerariagomez com js ggogle a201
  • SQL 查询选择每组具有最大值的每一行

    我对 SQL 很陌生 这个问题让我难住了 你能帮我解答这个问题吗 我有以下 2 个表 表 1 问题表 Id RunId Value 1 1 10 2 1 20 3 1 30 4 2 40 5 2 50 6 3 60 7 4 70 8 5 8
  • 如何将sql查询结果转储到文件中

    好吧 我现在的情况是 我需要将 sql 查询的结果转储到文件中 这是出于备份目的 我尝试从终端运行以下命令 mysql e select from products where brand id 5 u root p database na
  • WTSRegisterSessionNotification 有时在 XP home 启动时不起作用

    我正在使用该函数 消息来检查工作站是否已锁定 现在我的应用程序位于启动文件夹中 它在 XP pro 上运行没有任何问题 但由于我在 XP home 上使用该程序 WTSRegisterSessionNotification 在启动时大约有
  • 一起使用facet_grid和facet_wrap

    我正在尝试使用创建图表facet wrap with a facet grid在每个包裹的方面内 但我无法做到 有什么建议么 例如 如果我要对 2 个数量的月平均值进行同比比较 我希望 2 个面 每个数量一个 每个月份的 5 个数量方面都有
  • Flash 源代码控制 - 最佳实践

    我现在正在开发一个 Flash 项目 我不得不迫使设计人员使用我们的源代码控制存储库 SVN 来帮助管理和跟踪项目 让他完全接受源代码控制的好处是一场艰苦的战斗 但它正在到来 除了我是唯一一个参与 Flash 项目的项目之外 我以前从未在
  • 无法创建目录 /home/hadoop/hadoopinfra/hdfs/namenode/current

    我收到错误 Cannot create directory home hadoop hadoopinfra hdfs namenode current 尝试在我的本地 Mac 上安装 hadoop 时 这可能是什么原因 仅供参考 我将我的
  • 更新嵌套字典中的值 - Python

    我创建了一个字典 如下所示 gP dict fromkeys range 6 a None b None c None d None 现在 当我尝试修改一个值时 gP 0 a 1 由于某种原因 所有的值a 不管它们属于哪个键 更改为1 如下
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 在 shell 脚本中扩展变量

    我有一个需要循环的查询 query select dbserver as server while read dbserver username password dbname type do mysql h dbserver u user
  • 如何使用 VBA 将数据从关闭的工作簿(保持关闭状态)复制到主工作簿中?

    我需要使用 VBA 将数据从关闭的工作簿复制到主工作簿中 而不打开它们 I use Workbooks Open从 4 6 个文件开始 每个需要打开的文件都会大大减慢复制操作的速度 我需要高效的 VBA 代码来复制数据 而无需打开每个文件
  • Azure 存储非经典 (V2) - 如何配置自定义域

    在新的 Azure 门户中 有 2 个存储帐户 非经典帐户和经典帐户 因为我认为经典就是旧版本 所以我选择非经典 问题是 我无法在新门户上配置自定义域 它将我重定向到旧的 azure 门户 manage windowszuare com 问
  • 隐藏包中的模块导入

    我有一个小包 有一些依赖项 例如 pandas 和 gensim 文件结构是这样的 package init py agg clean py In the init py文件 我有import agg clean所以我能够以链式方式访问这些