From 0f3c5f288b423291db140d0a4070ffb188bf0338 Mon Sep 17 00:00:00 2001 From: feilong Date: Sun, 21 Nov 2021 00:17:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B9/10/11=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config.json" | 2 +- .../import_json_example.json" | 13 -- .../import_lib.json" | 6 + .../import_lib.md" | 109 ++++++++++ .../import_lib.py" | 14 +- .../import_other_module.json" | 18 +- .../import_other_module.md" | 203 ++++++++++++++++++ .../import_other_module.py" | 20 +- .../import_relative.json" | 6 + .../import_relative.md" | 87 ++++++++ .../import_relative.py" | 14 ++ .../import_with_from.json" | 20 -- .../import_with_from.py" | 14 -- .../package/__init__.py" | 0 .../package/moduleA.py" | 3 + .../package/subpackage1/__init__.py" | 0 .../package/subpackage1/moduleX.py" | 11 + .../package/subpackage1/moduleY.py" | 3 + .../package/subpackage2/__init__.py" | 0 .../package/subpackage2/moduleZ.py" | 4 + .../parent/__init__.py" | 2 + .../parent/one/__init__.py" | 2 + .../parent/one/one/__init__.py" | 2 + .../parent/three/__init__.py" | 2 + .../parent/two/__init__.py" | 2 + 25 files changed, 485 insertions(+), 72 deletions(-) delete mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.json" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.json" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.md" rename "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.py" => "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.py" (58%) create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.md" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.json" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.md" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.py" delete mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.json" delete mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/moduleA.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleX.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleY.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/moduleZ.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/one/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/three/__init__.py" create mode 100644 "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/two/__init__.py" diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/config.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/config.json" index d9d42b2..431265a 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/config.json" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/config.json" @@ -1,6 +1,6 @@ { "export": [ - "import_json_example.json", + "import_lib.json", "import_other_module.json", "import_with_from.json" ], diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.json" deleted file mode 100644 index 19e49eb..0000000 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.json" +++ /dev/null @@ -1,13 +0,0 @@ -{ - "one_line": { - "import json": [ - "#include ;", - "using json;", - "import json;" - ] - }, - "source": "import_json_example.py", - "depends": [], - "exercise_id": 163, - "type": "code_options" -} \ No newline at end of file diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.json" new file mode 100644 index 0000000..2e0f8ee --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.json" @@ -0,0 +1,6 @@ +{ + "source": "import_lib.md", + "depends": [], + "exercise_id": 163, + "type": "code_options" +} \ No newline at end of file diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.md" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.md" new file mode 100644 index 0000000..e924257 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.md" @@ -0,0 +1,109 @@ +# Python标准库模块导入 + +Python 语言通过`模块(module)`来组织代码。Python 标准库十分庞大,由C语言编写的内置模块,和由 Python 编写的解决常见开发需求的模块。下面的`Python数组`列举了常用标准库。 + +```python +python_modules = [ + "os --- 多种操作系统接口", + "os.path --- 常用路径操作", + "re --- 正则表达式操作", + "datetime --- 基本日期和时间类型", + "heapq --- 堆队列算法", + "enum --- 对枚举的支持", + "math --- 数学函数", + "random --- 生成伪随机数", + "itertools --- 为高效循环而创建迭代器的函数", + "functools --- 高阶函数和可调用对象上的操作", + "shutil --- 高阶文件操作", + "sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块", + "csv --- CSV 文件读写", + "hashlib --- 安全哈希与消息摘要", + "hmac --- 基于密钥的消息验证", + "time --- 时间的访问和转换", + "argparse --- 命令行选项、参数和子命令解析器", + "logging --- Python 的日志记录工具", + "threading --- 基于线程的并行", + "multiprocessing --- 基于进程的并行", + "socket --- 底层网络接口", + "email --- 电子邮件与 MIME 处理包", + "json --- JSON 编码和解码器", + "urllib --- URL 处理模块", + "http --- HTTP 模块" +] +``` + +使用 `import` 相关的语句可以引入 Python 标准库模块。特别地,`import` 可以被动态的从任何地方调用。 + +以下导入模块的用法中,错误的选项是? + +## template + +```python +import json +from os import path +import datetime as dt +import time + +if __name__ == '__main__': + obj = { + 'err': 'success', + 'result': ['item1', 'item2'] + } + print(json.dumps(obj)) + + print(path.abspath('.')) + + print(dt.datetime.now()) + + import math + print(math.ceil(1.3333)) + + print(time.time()) +``` + +## 答案 + +```python +import time.time + +if __name__ == '__main__': + print(time()) +``` + +## 选项 + +### 使用 import 语句 + +```python +import json + +if __name__ == '__main__': + obj = {'key': 'value'} + print(json.dumps(obj)) +``` + +### 使用 from .. import .. 语句 + +```python +from os import path + +if __name__ == '__main__': + print(path.abspath('.')) +``` + +### 使用 import .. as .. 语句 + +```python +import datetime as dt + +if __name__ == '__main__': + print(dt.datetime.now()) +``` + +### 动态导入 + +```python +if __name__ == '__main__': + import math + print(math.ceil(1.3333)) +``` diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.py" similarity index 58% rename from "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.py" rename to "data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.py" index 9cfc869..d348cbe 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_json_example.py" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_lib.py" @@ -5,6 +5,9 @@ import json +from os import path +import datetime as dt +import time def dump_json(obj): @@ -16,4 +19,13 @@ if __name__ == '__main__': 'err': 'success', 'result': ['item1', 'item2'] } - dump_json(obj) + print(json.dumps(obj)) + + print(path.abspath('.')) + + print(dt.datetime.now()) + + import math + print(math.ceil(1.3333)) + + print(time.time()) diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.json" index df05334..d229b32 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.json" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.json" @@ -1,20 +1,6 @@ { - "multiline": [ - { - "import import_json_example": "import import_json_example.dump_json", - "import_json_example.dump_json": "dump_json" - }, - { - "import_json_example.dump_json": "dump_json" - }, - { - "import import_json_example": "import import_json_example;" - } - ], - "source": "import_other_module.py", - "depends": [ - "import_json_example.py" - ], + "source": "import_other_module.md", + "depends": [], "exercise_id": 164, "type": "code_options" } \ No newline at end of file diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.md" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.md" new file mode 100644 index 0000000..ce4b782 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.md" @@ -0,0 +1,203 @@ +# 从前有座山,山上有座庙,庙里有个老和尚说:使用Python 包(package)组织代码 + +稍微正式一点的项目,都会通过将代码组织成有层次结构的组织,以便于管理和持续维护。Python 通过`包(package)`的方式来组织代码,包是一种特殊的`模块(module)`。 + +Python 的包有两种形式,分别是`Regular packages` 和 `namespace packages`。 + +所谓 `Regular packages` 就是指含有__init__.py的目录,这样的包被其他模块导入的时候,会先执行目录下`__init__.py`里的代码。`Regular packages` 可以嵌套,也就是目录下的子目录也可以是一个包。例如: + +```python +python_package_dir_example = ''' +parent/ + __init__.py + one/ + __init__.py + one/ + __init__.py + two/ + __init__.py + three/ + __init__.py +''' +``` + +而 `namespace packages` 也是有层次结构的模块组织,不过它未必是存在文件夹里的,可以存在Zip压缩包里,也可以存在网络上,而且子包和父包也未必要存储在同一个地方。这里忽略不展开。 + +假设`parent/__init__.py` 里的代码是: + +```python +# -*- coding: UTF-8 -*- +print('从前有座山,') +``` + +假设`parent/one/__init__.py` 里的代码是: + +```python +# -*- coding: UTF-8 -*- +print('山上有座庙,') +``` + +假设`parent/one/one/__init__.py` 里的代码是: + +```python +# -*- coding: UTF-8 -*- +print('庙里有个老和尚,') +``` + +假设`parent/two/__init__.py` 里的代码是: + +```python +# -*- coding: UTF-8 -*- +print('老和尚说:') +``` + +假设`parent/three/__init__.py` 里的代码是: + +```python +# -*- coding: UTF-8 -*- +print('从前有座山,') +``` + +如果一个模块被`import`过,Python 会将导入的模块缓存在`sys.modules`字典里缓存起来,再次导入的时候不会重新执行导入动作,直接从缓存里取。反之,如果我们从`sys.modules`里把导入的模块删除,则再次`import`会再次触发模块导入动作。 + +利用以上知识,我们的目标是通过 `import` 语句导入模块,触发每个包目录下`__init__.py`加载时执行`print`语句,从而循环打印出: + +```bash +从前有座山, +山上有座庙, +庙里有个老和尚, +老和尚说: +从前有座山, +山上有座庙, +庙里有个老和尚, +老和尚说: +从前有座山, +... +``` + +以下导入模块的用法中,不能循环打印出上述绕口令的选项是? + +## template + +```python +import sys + +if __name__ == '__main__': + while True: + import parent.one.one + del sys.modules['parent.one.one'] + + import parent.one + del sys.modules['parent.one'] + + import parent.two + del sys.modules['parent.two'] + + import parent + del sys.modules['parent'] +``` + +## 答案 + +```python +import sys + +if __name__ == '__main__': + while True: + import parent + import parent.one.one + import parent.two + + del sys.modules['parent'] + del sys.modules['parent.one.one'] + del sys.modules['parent.two'] +``` + +## 选项 + +### A + +```python +import sys + +if __name__ == '__main__': + while True: + import parent.one.one + del sys.modules['parent.one.one'] + + import parent.one + del sys.modules['parent.one'] + + import parent.two + del sys.modules['parent.two'] + + import parent + del sys.modules['parent'] +``` + +### B + +```python +import sys + +if __name__ == '__main__': + while True: + import parent.one.one + import parent.two + import parent.three + + del sys.modules['parent.one'] + del sys.modules['parent.one.one'] + del sys.modules['parent.two'] + del sys.modules['parent.three'] +``` + +### C + +```python +import sys + +if __name__ == '__main__': + while True: + import parent.one.one + import parent.two + import parent + + del sys.modules['parent.one'] + del sys.modules['parent.one.one'] + del sys.modules['parent.two'] + del sys.modules['parent'] +``` + +### D + +```python +import sys + +if __name__ == '__main__': + while True: + import parent + import parent.one + import parent.one.one + import parent.two + + del sys.modules['parent'] + del sys.modules['parent.one'] + del sys.modules['parent.one.one'] + del sys.modules['parent.two'] +``` + +### E + +```python +import sys + +if __name__ == '__main__': + while True: + import parent.one.one + import parent.two + del sys.modules['parent'] + del sys.modules['parent.one'] + del sys.modules['parent.one.one'] + del sys.modules['parent.two'] +``` diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.py" index f733843..17975c5 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.py" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_other_module.py" @@ -3,12 +3,18 @@ # 标题:Python 模块导入2 # 描述:通过 import 导入自己写的另外一个模块 -import import_json_example - +import sys if __name__ == '__main__': - obj = { - 'err': 'success', - 'result': ['item1', 'item2'] - } - import_json_example.dump_json(obj) + while True: + import parent.one.one + del sys.modules['parent.one.one'] + + import parent.one + del sys.modules['parent.one'] + + import parent.two + del sys.modules['parent.two'] + + import parent + del sys.modules['parent'] diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.json" new file mode 100644 index 0000000..48be1bc --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.json" @@ -0,0 +1,6 @@ +{ + "source": "import_relative.py", + "depends": [], + "exercise_id": 165, + "type": "code_options" +} \ No newline at end of file diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.md" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.md" new file mode 100644 index 0000000..c3cedeb --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.md" @@ -0,0 +1,87 @@ +# 使用相对路径导入包 + +良好的包/模块组织在程序开发中有重要的作用。随着项目代码的逐渐增加,一开始的单文件程序会逐渐膨胀,所幸 Python 提供当包模式可以良好应对通常的代码分层组织。 + +但是,当目录层次增加后,在下层目录里的代码引用其他目录的模块时,总是要输入全部路径有时并不方便,此时可以考虑使用 Python 的包相对路径来导入模块。 + +假设如下的`Python字符串`描述的包目录结构: + +```python +relative_packages = ''' +package/ + __init__.py + subpackage1/ + __init__.py + moduleX.py + moduleY.py + subpackage2/ + __init__.py + moduleZ.py + moduleA.py +''' +``` + +假设: + +* `package/subpackage1/moduleY.py` 里定义了函数 `spam` +* `package/subpackage2/moduleZ.py` 里定义了函数 `eggs` +* `package/moduleA.py` 里定义了函数 `foo` + +以下选项都是在文件`package/subpackage1/moduleX.py`里导入模块的代码,请问错误的选项是哪个?你知道为什么吗? + +## template + +```python +if __name__ == '__main__': + print( + ''' +Absolute imports may use either the import <> or from <> import <> syntax, but relative imports may only use the second form; the reason for this is that: +```import XXX.YYY.ZZZ``` +should expose `XXX.YYY.ZZZ` as a usable expression, but .moduleY is not a valid expression. + ''' + ) +``` + +## 答案 + +```python +import ..subpackage2.moduleZ +``` + +## 选项 + +### A + +```python +from .moduleY import spam +``` + +### B + +```python +from .moduleY import spam as ham +``` + +### C + +```python +from . import moduleY +``` + +### D + +```python +from ..subpackage1 import moduleY +``` + +### E + +```python +from ..subpackage2.moduleZ import eggs +``` + +### F + +```python +from ..moduleA import foo +``` diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.py" new file mode 100644 index 0000000..431ea43 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_relative.py" @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +# 作者:幻灰龙 +# 标题:Python 模块导入3 +# 描述:相对目录导入 + + +if __name__ == '__main__': + print( + ''' +Absolute imports may use either the import <> or from <> import <> syntax, but relative imports may only use the second form; the reason for this is that: +```import XXX.YYY.ZZZ``` +should expose `XXX.YYY.ZZZ` as a usable expression, but .moduleY is not a valid expression. + ''' + ) diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.json" deleted file mode 100644 index f31db58..0000000 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.json" +++ /dev/null @@ -1,20 +0,0 @@ -{ - "multiline": [ - { - "from import_json_example import dump_json": "from import_json_example import import_json_example", - "dump_json": "import_json_example.dump_json" - }, - { - "from import_json_example import dump_json": "import dump_json from import_json_example" - }, - { - "dump_json(obj)": "import_json_example.dump_json(obj)" - } - ], - "source": "import_with_from.py", - "depends": [ - "import_json_example.py" - ], - "exercise_id": 165, - "type": "code_options" -} \ No newline at end of file diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.py" deleted file mode 100644 index 3ba353e..0000000 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/import_with_from.py" +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: UTF-8 -*- -# 作者:幻灰龙 -# 标题:Python 模块导入3 -# 描述:通过 from 语句导入模块 - -from import_json_example import dump_json - - -if __name__ == '__main__': - obj = { - 'err': 'success', - 'result': ['item1', 'item2'] - } - dump_json(obj) diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/moduleA.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/moduleA.py" new file mode 100644 index 0000000..76a7b96 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/moduleA.py" @@ -0,0 +1,3 @@ + +def foo(): + print('foo') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleX.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleX.py" new file mode 100644 index 0000000..1be0e1e --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleX.py" @@ -0,0 +1,11 @@ +from .moduleY import spam +from .moduleY import spam as ham +from . import moduleY +from ..subpackage1 import moduleY +from ..subpackage2.moduleZ import eggs +from ..moduleA import foo + +spam() +ham() +eggs() +foo() diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleY.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleY.py" new file mode 100644 index 0000000..d9d176c --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage1/moduleY.py" @@ -0,0 +1,3 @@ + +def spam(): + print('spam') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/moduleZ.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/moduleZ.py" new file mode 100644 index 0000000..654c69a --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/package/subpackage2/moduleZ.py" @@ -0,0 +1,4 @@ + + +def eggs(): + print('eggs') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/__init__.py" new file mode 100644 index 0000000..0958e88 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/__init__.py" @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- +print('从前有座山,') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/__init__.py" new file mode 100644 index 0000000..56b6d61 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/__init__.py" @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- +print('山上有座庙,') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/one/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/one/__init__.py" new file mode 100644 index 0000000..22017ab --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/one/one/__init__.py" @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- +print('庙里有个老和尚,') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/three/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/three/__init__.py" new file mode 100644 index 0000000..0958e88 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/three/__init__.py" @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- +print('从前有座山,') diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/two/__init__.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/two/__init__.py" new file mode 100644 index 0000000..d87f493 --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/7.\346\250\241\345\235\227\347\256\241\347\220\206/parent/two/__init__.py" @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- +print('老和尚说:') -- GitLab