网站首页 > 教程分享 正文
阅读关于import的内容时,笔者先就内心的一个疑惑——循环引用——做了一个小小测试。
测试代码为两个很小文件:
# a.py
from b import VAR_B
VAR_A = 'var_a'
print(VAR_B)
# b.py
from a import VAR_A
VAR_B = 'var_b'
print(VAR_A)
测试结果如下:
>python3 a.py
Traceback (most recent call last):
File "/Users/dd/learn/python/effective-python/a.py", line 3, in <module>
from b import VAR_B
File "/Users/dd/learn/python/effective-python/b.py", line 2, in <module>
from a import VAR_A
File "/Users/dd/learn/python/effective-python/a.py", line 3, in <module>
from b import VAR_B
ImportError: cannot import name 'VAR_B' from partially initialized module 'b' (most likely due to a circular import)
显然,Python是有做循环引用检测的,如果存在循环引用,代码执行时会抛出异常。(此处笔者有一个对自己过去认知的疑问:我印象中Python中循环引用是可以的,这印象来源于何处呢?笔者不深想,因为好的代码结构,是不推荐多个模块互相引用的。)
PEP8关于import的建议,笔者并无更多思考,只在此处做一些搬运。
1、分行
# 对的
import os
import sys
# 不好的
import os, sys
# 可以的
from subprocess import Popen, PIPE
2、位置
import语句,最好都放在文件开头。
这一条,笔者在Python标准库中有看到“不按规则”行事。
# Lib.http.client.py
# 第1446行
try:
import ssl
except ImportError:
pass
else:
class HTTPSConnection(HTTPConnection):
"This class allows communication via SSL."
# ...
示例代码来源于此:https://github.com/python/cpython/tree/3.12/Lib/http
3、顺序
请按以下顺序进行导入:
- 标准库;
- 相关的第三方包;
- 本项目模块;
其中每一组之间,添加一个空行以示分割;每个组内,按字母顺序排列(笔者曾经很喜欢使用模块名称长度排序,我认为那样很好看)。
笔者最近工作中写C++较多,看到此处时也有去搜一下C++的include风格推荐,有看到谷歌的风格。谷歌的工程师,对C++ include顺序的推荐,也是相似的。
来源链接:https://google.github.io/styleguide/cppguide.html#Header_Files
建议顺序(Include headers in the following order):
Related header(相关文件,即cc或cpp同名的那个头文件);
C system headers(C系统头文件,笔者搜了一下,列表该在这个链接中:https://en.cppreference.com/w/c/header。注:但笔者并不很确定,只先摘在此处);
C++ standard library headers(C++标准库头文件);
other libraries' headers(使用的其它库的头文件);
your project's headers(自己项目中的内容)。
笔者曾经自学过一段时间golang语言,我对go语言当中对import的处理,是相当赞同的。go语言当中,可以使用go fmt指令将导入内容做排序操作,且如果导入的模块未使用,会报错:
"fmt" imported and not used
4、路径
PEP8推荐使用绝对路径导入,这样会有两个好处:可读性相对较好且出现问题时报错信息更全面。但并非绝对,如果相对路径导入拥有更好可读性,也是可以选择相对路径的。
此处看似自相矛盾,但其实内里核心只是一条:一切都为可读性。
5、不要使用import *
如题。
6、小结
关于import,笔者只整理到此处;甚至关于PEP8,也只到此处。其实文档中还有其它内容,比如逗号、注释等等,但本系列博客以书籍Effective Python作为基础,于是章节划分都尽量以书中内容为准。
笔者依然建议大家看看PEP8官方文档,它并不长。
英文版:https://peps.python.org/pep-0008/
中文版:https://github.com/kernellmd/Knowledge/blob/master/Translation/PEP%208%20%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91.md
总之,大家的Python代码风格,请尽量遵守PEP8;但别忘了,项目组的风格优先级高于PEP8。
毕竟我们的代码,读比写更多。
猜你喜欢
- 2024-09-09 彻底告别python第三方包import问题!只需要7行代码(码住)
- 2024-09-09 python每日一练之如何copy(python copy)
- 2024-09-09 你知道import Vue from 'vue' 吗?
- 2024-09-09 spring中的@import/@ImportResource注解
- 2024-09-09 Spring中@Import注解详解(spring import注解原理)
- 2024-09-09 python首行代码import *,from * import * 解析
- 2024-09-09 Import注解的理解(java @import注解)
- 2024-09-09 link与@import的区别和分别对应的例子
- 2024-09-09 第五章 import导入第三方库或者模块
- 2024-09-09 ES6模块化一缕(export、import)(es6模块化引入)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)