当前位置: 首页 > 面试题库 >

Python导入机制

鱼阳伯
2023-03-14
问题内容

我有两个相关的Python“导入”问题。它们很容易测试,但是我想要的答案是语言定义的,而不是特定于实现的,而且我对样式/约定也很感兴趣,所以我在这里问。

1)

如果模块A导入模块B,模块B导入模块C,则模块A中的代码可以引用模块C而不进行显式导入吗?如果是这样,我是否认为这是错误的做法?

2)

如果导入模块ABC,那么是否也导入模块A和AB?如果是这样,按照惯例更好地进行显式表示import A; import A.B; import A.B.C吗?


问题答案:

您应该知道的第一件事是Python语言不是ISO标准。这与C / C ++完全不同,这意味着没有“适当”的方法来定义语言行为-
CPython可能会做某事,因为它是用这种方式编码的,而Jython可能会做另一回事。

关于您的问题,请记住“导入”模块是一个分为两部分的操作:首先加载该模块-
如果从未加载过该模块,例如,如果sys.modules中不提供该模块,则将名称绑定到该模块在本地名称空间中。

因此:

1)是的,您可以通过提供适当的名称空间来引用模块a中的任何内容,例如,您必须执行以下操作

BCname =“某物”

而且我认为这很少在Python程序中完成,并且可能会被认为是不好的做法,因为它会强制执行“传递性dep”-如果某些模块B的实现被重构并且不再依赖于C,它应该继续提供C模块为满足A部门。

当然,设置__ all 可以避免这种情况,一个好的实践可能是将 all __放入所有模块中,并 导出要真正公开的符号。

2)是和否。在做

import a.b.c.d

在所有模块上执行第 一个
导入阶段(加载),但第二个阶段仅在a上执行(并且递归地,在b中相对于c等),但是链中的所有模块都必须由完整的命名空间引用;这样导入后,您可以

a.something
a.b.something
a.b.c.something

但是你做不到

c.something
b.something

我必须承认这种用法也很罕见。我通常更喜欢“从模块中导入某些东西”的导入方式,并且通常您只是问自己需要什么-这种嵌套在库中既不常见,也不常见。

很多时候,有用于组织的“外部软件包”,其中包含带有类的模块。上面的a,b,c很可能只是包,而d是真正包含类,函数和其他对象的模块。因此正确的用法是:

from a.b.c.d import name1, name2, name3

我希望这能满足您的好奇心。



 类似资料:
  • 问题内容: 我正在导入许多不同的脚本,因此在文件的顶部,它会被导入语句弄得乱七八糟,即: 有没有办法将所有这些都移动到其他地方,然后我要做的就是导入该文件,所以它只是一个干净的导入? 问题答案: 当然有;只需在主文件所在的目录中创建一个名为的文件,然后将导入文件放置在该目录中即可。然后,您可以简单地在主脚本中使用。

  • 我们是否可以使用单个关键字而不是从'react-native‘中导入{Text,TextInput,Button,StyleSheet,View};“在react Native中?”text、TextInput、Button、StyleSheet、view“是否有可用的单个关键字选项?

  • 问题内容: 如何将winDLL导入python并能够使用其所有功能?它只需要双打和字符串。 问题答案: 您已经标记了问题ctype,所以听起来您已经知道答案了。 该ctypes的教程非常出色。阅读并理解该说明后,您将可以轻松完成。 例如: 还有我自己的代码中的一个示例:

  • 我遵循Android安装React导航的所有说明。 首先,“npm安装--Save React-Navigation”,“npm安装--Save React-Native-Gesture-Handler”。“react-native link react-native-gesture-handler”,最后,更新了我的 这是我得到的错误: 错误所在:在创建目录'd:\react Native pr

  • 本文向大家介绍Python动态导入模块和反射机制详解,包括了Python动态导入模块和反射机制详解的使用技巧和注意事项,需要的朋友参考一下 一、前言 何谓动态导入模块,就是说模块的导入可以根据我们的需求动态的去导入,不是像一般的在代码文件开头固定的导入所需的模块。 何谓反射机制,利用字符串的形式在模块或对象中操作(查找/获取/删除/添加)成员。 下面进入具体实例介绍环节。先创建一个示例文件exam

  • 问题内容: 所以我得到这个错误 并且你可以看到我进一步使用了相同的import语句,并且可以正常工作吗?关于循环导入是否有一些不成文的规定?如何在调用堆栈的更下方使用同一类? 问题答案: 我认为jpmc26的答案虽然绝非错误,但在循环进口上却过于严格。如果正确设置它们,它们可以正常工作。 最简单的方法是使用语法,而不是。前者几乎总是可以工作,即使包括在内也能使我们重新获得利益。后者只有在中已经定义