- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 python 初学者,目前正在学习 python 中的导入模块。所以我的问题是:假设我目前有三个python文件,分别是module1.py、module2.py和module3.py;
在 module1.py 中:
def function1():
print('Hello')
在 module2.py 中,为了使用 module1.py 中的那些函数:
import module1
#Also, I have some other public functions in this .py file
def function2():
print('Goodbye')
#Use the function in module1.py
if __name__ == '__main__':
module1.function1();
function2();
在 module3.py 中,我想同时使用 module1.py 和 module2.py 中的函数。
import module1
import module2
def function3():
print('Nice yo meet you');
if __name__ == '__main__':
module1.function1()
function3()
module2.function2()
看起来好像有效。但是我的问题主要是关于module3.py。原因是在module3.py中,我同时导入了module1和module2。但是,module1 已经被 module2 导入了。我只是想知道这是否是一种好的编码方式?这有效吗?我应该这样做吗?或者我应该避免这样做吗?为什么?
非常感谢。我只是一个初学者,所以如果我提出愚蠢的问题,请原谅我。谢谢!!
最佳答案
如果你避免循环导入就不会有问题,也就是说你永远不会导入一个本身会导入当前导入模块的模块。
模块看不到导入器命名空间,因此导入器代码中的导入不会成为导入模块的全局变量。
此外,模块顶层代码将仅在首次导入时运行。
编辑 1:
我在这里回答 Filipe 的评论,因为它更容易。
“如果避免循环导入就不会有问题”-> 这是不正确的,python 在大多数情况下都可以使用循环导入。”
事实上,您察觉到我的一些误解,但这并不意味着该特定陈述是不正确的。这是正确的,也是很好的建议。
(说它在大多数情况下都很好看起来有点像在说某事在大多数时间都可以正常运行...)
我明白你的意思了。我非常避免它,我什至认为你的第一个例子会立即给出错误(它没有)。你的意思是没有必要避免它,因为大多数时候(实际上在特定条件下)Python 会很好地处理它。我也确信在某些情况下循环导入是最简单的解决方案。这并不意味着我们应该在有选择的情况下使用它们。这会促进不良架构的使用,其中每个模块开始时都相互依赖。
这也意味着编码人员必须了解警告。
我找到的这个链接here在 SO 中陈述了对循环导入的一些担忧。
之前的链接有些旧,因此信息可能会被较新的 Python 版本过时,但是 import confusion甚至更老,仍然适用于 3.6.2。
您提供的示例运行良好,因为相关或初始化模块代码包装在一个函数中,不会在导入时运行。使用 if __name__ == "__main__":
保护代码也会在导入时将其从运行中移除。
像这样简单的东西(来自 effbot.org 的同一个例子)是行不通的(记住 OP 说他是初学者):
# file y.py
import x
x.func1()
# file x.py
import y
def func1():
print('printing from x.func1')
在您的第二条评论中,您说:“这也是不正确的。导入的模块将成为命名空间的一部分”
是的。但我没有提到这一点,也没有相反。我刚刚说过导入的模块代码不知道进行导入的代码的命名空间。
为了消除歧义,我的意思是这样的:
# w.py
def funcw():
print(z_var)
# z.py
import w
z_var = 'foo'
w.funcw() # error: z_var undefined in w module namespace
运行 z.py
会给出所述错误。这就是我的意思。
现在更进一步,为了获得我们想要的访问权限,我们进行循环...
# w.py
import z # go circular
def funcw():
'''Notice that we gain access not to the z module that imported
us but to the z module we import (yes its the same thing but
carries a different namespace). So the reference we obtain
points to a different object, because it really is in a
different namespace.'''
print(z.z_var, id(z.z_var))
...我们保护一些代码不与导入一起运行:
# z.py
import w
z_var = ['foo']
if __name__ == '__main__':
print(z_var, id(z_var))
w.funcw()
通过运行 z.py
,我们确认对象是不同的(它们可以与不可变对象(immutable对象)相同,但这是 python 字距调整 - 内部优化或实现细节 - 在起作用):
['foo'] 139791984046856
['foo'] 139791984046536
最后,我同意您关于明确导入的第三条评论。
无论如何,我感谢您的评论。因为他们,我实际上提高了对问题的理解(我们不会通过避免它来学到很多东西)。
关于python - 在 python 中,有关导入导入另一个模块的模块的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49960786/
当我这样做时... import numpy as np ...我可以使用它但是... import pprint as pp ...不能,因为我需要这样做... from pprint import
我第一次尝试将 OpenCV 用于 Python 3。要安装,我只需在终端中输入“pip3 install opencv-python”。当我这样做时,我在 Finder(我在 Mac 上)中看到,在
如果有一个库我将使用至少两种方法,那么以下之间在性能或内存使用方面是否有任何差异? from X import method1, method2 和 import X 最佳答案 有区别,因为在 imp
我正在从 lodash 导入一些函数,我的同事告诉我,单独导入每个函数比将它们作为一个组导入更好。 当前方法: import {fn1, fn2, fn3} from 'lodash'; 首选方法:
之间有什么关系: import WSDL 中的元素 -和- import元素和在 XML Schema ...尤其是 location 之间的关系前者和 schemaLocation 的属性后者的属性
我在从 'theano.configdefaults' 导入 'local_bitwidth' 时遇到问题。并显示以下消息: ImportError
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
对于当前的项目,我必须使用矩阵中提供的信息并对其进行数学计算,以及使用 ITK/VTK 函数来显示医疗信息/渲染。基本上我必须以(我猜)50/50 的方式同时使用 matlab 例程和 VTK/ITK
当我看到 pysqlite 的示例时,SQLite 库有两个用例。 from sqlite3 import dbapi2 as sqlite3 和 import sqlite3 为什么有两种方式支持s
我使用 Anaconda Python 发行版:Python 2.7 x64 和 Windows 7 SP1 x64 Ultimate。 当我import matplotlib.pyplot时,我得到
目录 【容器】镜像导出/导入 导出 导入 带标签 不带标签,后期修改 【仓库】镜像导出/导入
我正在寻找一种导入模块的方法,以便我可以从子文件夹 project/v0 和根文件夹 project 运行脚本。/p> 我在 python 3.6 中的文件结构(这就是没有初始化文件的原因) proj
我通常被告知以下是不好的做法。 from module import * 主要原因(或者有人告诉我)是,您可能会导入一些您不想要的东西,并且它可能会隐藏另一个模块中具有类似名称的函数或类。 但是,Py
我为 urllib (python3) 编写了一个小包装器。在if中导入模块是否正确且安全? if self.response_encoding == 'gzip': import gzip
我正在 pimcore 中创建一个新站点。有没有办法导出/导入 pimcore 站点的完整数据,以便我可以导出 xml/csv 格式的 pimcore 数据进行必要的更改,然后将其导入回来? 最佳答案
在 Node JS 中测试以下模块布局,看起来本地导出的定义总是在名称冲突的情况下替换外部导出的定义(参见 B.js 中的 f1)。 A.js export const f1 = 'A' B.js e
我在使用 VBA 代码时遇到了一些问题,该代码应该将 excel 数据导入我的 Access 数据库。当我运行代码时,我收到一个运行时错误“运行时错误 438 对象不支持此属性或方法”。来自我在其他论
我有一个名为 elements 的包,其中包含按钮、trifader、海报等内容。在 Button 类中,我正在执行 from elements import * 这执行正常,当我尝试 print(p
在我长期使用 python 的经验中,我遇到了一个非常奇怪的问题。 提前我想说我想知道为什么会发生这种情况 ,而不是如何更改我的代码或如何修复它,因为我也可以做到。 我正在使用 python2.7.3
我正在更新我的包。但是,我正在为依赖项/导入而苦苦挣扎。我使用了两个冲突的包 - ggplot2和 psych及其功能 alpha当然还有 alpha ggplot2 的对象不同于 alpha psy
我是一名优秀的程序员,十分优秀!