Python模块导入详解与最佳实践

Python模块导入详解:方式、使用与注意事项

作为软件工程师,掌握Python模块导入是必备技能。本文将全面解析Python模块导入的各种方式、使用方法及注意事项。

目录

基本导入方式

1. 导入整个模块

python 复制代码
import math
import os
import sys

使用方式:

python 复制代码
import math
result = math.sqrt(16)  # 需要通过模块名访问
print(math.pi)          # 访问模块中的变量

2. 导入特定内容

python 复制代码
from math import sqrt, pi
from datetime import datetime, date

使用方式:

python 复制代码
from math import sqrt, pi
result = sqrt(16)       # 直接使用函数名
print(pi)               # 直接使用变量名

3. 导入所有内容(不推荐)

python 复制代码
from math import *

使用方式:

python 复制代码
from math import *
result = sqrt(16)       # 所有函数和变量都可直接使用
print(pi)
print(sin(0.5))

高级导入技巧

4. 别名导入

python 复制代码
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

使用方式:

python 复制代码
import numpy as np
array = np.array([1, 2, 3])  # 使用别名访问

import pandas as pd
df = pd.DataFrame(data)

5. 相对导入(包内使用)

python 复制代码
# 在包内部的模块中使用
from . import module_name      # 同级别模块
from .. import package_name    # 上级包
from .submodule import function # 子模块

6. 条件导入

python 复制代码
try:
    import requests
except ImportError:
    requests = None
    print("requests模块未安装")

# 使用前检查
if requests:
    response = requests.get("http://example.com")

模块使用详解

访问导入的内容

函数使用:

python 复制代码
import math
# 方式1:通过模块名
result = math.sqrt(25)

from math import sqrt
# 方式2:直接使用
result = sqrt(25)

变量使用:

python 复制代码
import math
# 访问模块常量
circumference = 2 * math.pi * radius

from math import pi
# 直接使用常量
circumference = 2 * pi * radius

类使用:

python 复制代码
from datetime import datetime
# 创建类的实例
now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")

检查可用内容

python 复制代码
import math

# 查看模块所有公共属性
print(dir(math))

# 查看特定函数帮助
help(math.sqrt)

# 查看模块文档
print(math.__doc__)

注意事项与最佳实践

1. 循环导入问题

python 复制代码
# 文件: module_a.py
import module_b  # 危险:如果module_b也导入module_a,形成循环

# 解决方案:在函数内部导入或重新设计代码结构
def some_function():
    import module_b  # 需要时再导入
    # 使用module_b

2. 命名冲突

python 复制代码
# 不推荐的写法
from math import *
from numpy import *  # 可能覆盖math中的同名函数

# 推荐的写法
import math
import numpy as np

value = math.sqrt(16)    # 明确使用math的sqrt
array = np.sqrt([1,4,9]) # 明确使用numpy的sqrt

3. 性能考虑

python 复制代码
# 在函数内部导入(延迟加载,减少启动时间)
def process_data():
    import pandas as pd  # 只在需要时导入
    # 处理数据代码

# 在模块顶部导入(代码清晰,易于维护)
import sys
import os

4. 路径和搜索顺序

python 复制代码
import sys

# 查看Python搜索路径
print(sys.path)

# 添加自定义路径
sys.path.append('/path/to/your/module')

5. 重新加载模块

python 复制代码
import importlib
import my_module

# 开发时重新加载模块
importlib.reload(my_module)

6. __init__.py 文件的作用

python 复制代码
# 在Python包中,__init__.py文件可以:
# - 标识目录为Python包
# - 执行初始化代码
# - 定义__all__变量控制import *的行为

# __init__.py 示例
__all__ = ['module1', 'module2', 'main_function']

from .module1 import *
from .module2 import *

7. 动态导入

python 复制代码
# 根据条件动态导入
module_name = "json" if condition else "pickle"
serializer = __import__(module_name)

# 使用importlib
import importlib
module = importlib.import_module("module_name")

实际应用示例

项目结构示例

复制代码
my_project/
├── main.py
├── utils/
│   ├── __init__.py
│   ├── math_utils.py
│   └── file_utils.py
└── models/
    ├── __init__.py
    └── user.py

导入示例

python 复制代码
# main.py
from utils.math_utils import add, multiply
from utils.file_utils import read_file
from models.user import User

# 使用导入的函数和类
result = add(5, 3)
content = read_file("data.txt")
user = User("John Doe")

配置式导入

python 复制代码
# 插件系统示例
PLUGINS = {
    'csv': 'csv_plugin',
    'json': 'json_plugin',
    'xml': 'xml_plugin'
}

def get_plugin(format_name):
    plugin_module = __import__(f"plugins.{PLUGINS[format_name]}", fromlist=[''])
    return plugin_module.Plugin()

总结

Python模块导入提供了灵活的代码组织方式,关键要点包括:

  1. 选择合适的导入方式 :根据场景选择import modulefrom module import name或别名导入
  2. 避免命名冲突:使用模块名前缀或别名区分同名标识符
  3. 注意导入时机:顶层导入保证代码清晰,函数内导入优化性能
  4. 处理循环导入:通过代码重构或在函数内导入解决
  5. 利用包机制 :使用__init__.py组织大型项目

掌握这些导入技巧和注意事项,将帮助你编写更清晰、可维护的Python代码,构建更加健壮的软件项目。


Python __init__.py 文件详解:作用、执行时机与包标识

什么是 __init__.py

__init__.py 是Python包(Package)的标识文件,它使得一个普通目录被Python识别为(Package)而不是简单的目录。

执行时机:自动执行

什么时候执行?

python 复制代码
# 当包被导入时,__init__.py 会自动执行
import my_package           # 执行 my_package/__init__.py
from my_package import sub  # 执行 my_package/__init__.py

示例验证:

python 复制代码
# 目录结构:
# my_package/
#   ├── __init__.py
#   └── module1.py

# __init__.py 内容:
print("__init__.py 正在执行!")
version = "1.0.0"

# 测试代码:
import my_package
# 输出: "__init__.py 正在执行!"

执行次数

python 复制代码
# __init__.py 只在第一次导入时执行一次
import my_package    # 第一次导入,执行 __init__.py
import my_package    # 第二次导入,不会再次执行

# 强制重新加载
import importlib
importlib.reload(my_package)  # 会再次执行 __init__.py

包标识的含义

没有 __init__.py 的情况

复制代码
regular_dir/
    module_a.py
    module_b.py
python 复制代码
# 这只是一个目录,不能作为包导入
import regular_dir  # ❌ 错误:ModuleNotFoundError

__init__.py 的情况

复制代码
my_package/
    __init__.py     # 这个文件使目录成为包
    module_a.py
    module_b.py
python 复制代码
# 现在可以作为一个包导入
import my_package   # ✅ 成功
from my_package import module_a  # ✅ 成功

__init__.py 的主要功能

1. 包级别初始化

python 复制代码
# my_package/__init__.py
print(f"初始化 {__name__} 包")

# 包级别的配置
CONFIG = {
    "debug": True,
    "version": "1.0.0"
}

# 初始化数据库连接、加载资源等
def _initialize():
    print("执行包初始化任务")
    
_initialize()

2. 控制导入行为 (__all__)

python 复制代码
# my_package/__init__.py
from .module_a import function1, function2
from .module_b import ClassA, ClassB

# 定义 from my_package import * 时导入的内容
__all__ = ['function1', 'function2', 'ClassA', 'ClassB']

使用效果:

python 复制代码
from my_package import *  # 只会导入 __all__ 中列出的内容

3. 简化导入路径

python 复制代码
# my_package/__init__.py

# 方式1:重新导出特定函数/类
from .submodule.utils import helper_function
from .core import MainClass

# 方式2:导入子模块
from . import submodule1, submodule2

# 方式3:提供便捷访问
def get_version():
    return "1.0.0"

用户使用体验:

python 复制代码
# 简化前
from my_package.submodule.utils import helper_function
from my_package.core import MainClass

# 简化后(在 __init__.py 中配置后)
from my_package import helper_function, MainClass

实际项目示例

项目结构

复制代码
data_processor/
    __init__.py
    readers/
        __init__.py
        csv_reader.py
        json_reader.py
    writers/
        __init__.py
        csv_writer.py
        json_writer.py
    utils.py

__init__.py 配置

顶层的 data_processor/__init__.py

python 复制代码
"""
数据处理器包
"""

__version__ = "1.0.0"
__author__ = "Your Name"

# 导入主要功能到包级别
from .readers import read_csv, read_json
from .writers import write_csv, write_json
from .utils import DataValidator, DataTransformer

# 控制 import * 的行为
__all__ = [
    'read_csv', 
    'read_json', 
    'write_csv', 
    'write_json',
    'DataValidator',
    'DataTransformer'
]

# 包初始化代码
print(f"数据处理器包 v{__version__} 已加载")

子包 readers/__init__.py

python 复制代码
from .csv_reader import read_csv
from .json_reader import read_json

__all__ = ['read_csv', 'read_json']

子包 writers/__init__.py

python 复制代码
from .csv_writer import write_csv
from .json_writer import write_json

__all__ = ['write_csv', 'write_json']

使用体验

python 复制代码
# 用户代码
import data_processor

# 可以直接使用顶层导入的功能
data = data_processor.read_csv("file.csv")
data_processor.write_json(data, "output.json")

# 或者按需导入
from data_processor import DataValidator
validator = DataValidator()

高级用法

条件导入

python 复制代码
# __init__.py
try:
    from .fast_implementation import compute
except ImportError:
    from .slow_implementation import compute

__all__ = ['compute']

延迟导入

python 复制代码
# __init__.py
def get_expensive_component():
    # 需要时才导入重量级模块
    from .heavy_module import ExpensiveClass
    return ExpensiveClass()

包版本管理

python 复制代码
# __init__.py
__version__ = "1.2.3"
__version_info__ = (1, 2, 3)

def get_version():
    return __version__

注意事项

1. Python 3.3+ 的变化

python 复制代码
# Python 3.3+ 中,__init__.py 不是必须的(命名空间包)
# 但为了兼容性和明确性,建议仍然包含它

# 有 __init__.py → 常规包
# 无 __init__.py → 命名空间包

2. 避免循环导入

python 复制代码
# __init__.py 中避免复杂的相互导入
# 错误示例:
from .module_a import func_a  # 如果 module_a 也导入包,形成循环

# 正确做法:在函数内部导入或重新设计结构

3. 性能考虑

python 复制代码
# 避免在 __init__.py 中执行耗时操作
# 这会影响包的导入速度

# 不好的做法:
import heavy_library  # 在顶层导入重量级库
initialize_database() # 执行耗时初始化

# 好的做法:
def get_heavy_component():
    import heavy_library  # 需要时再导入
    return heavy_library.Component()

总结

__init__.py 的核心作用:

  1. 包标识:将目录标记为Python包,使其可导入
  2. 自动执行:在包被导入时自动运行初始化代码
  3. 导入控制 :通过 __all__ 控制 import * 的行为
  4. 接口简化:提供更简洁的导入路径和包级别API
  5. 初始化:执行包级别的配置和初始化任务

理解 __init__.py 的工作机制,可以帮助你构建更加专业和易用的Python包,提供更好的用户体验和更清晰的代码结构。


我们来说说__init__.py文件。

init.py 文件详解

  1. 什么是 init .py?

    在Python中,一个目录如果包含了__init__.py文件,那么它就被视为一个包(Package)。包是一种组织模块的方式,可以包含多个模块或子包。

  2. init .py 什么时候执行?

    当包或包中的模块被导入时,init.py文件会被自动执行。也就是说,你不需要手动去执行它,Python的导入机制会自动处理。

例如,如果你有一个包名为mypackage,那么当你执行import mypackage时,mypackage目录下的__init__.py就会被执行。

  1. init .py 的作用
    a) 标识目录为Python包
    在Python 3.3之前,目录中必须包含__init__.py文件才能被识别为包。从Python 3.3开始,引入了命名空间包,即没有__init__.py的目录也可以被识别为包。但是,使用__init__.py仍然是一种常见且推荐的做法,因为它可以明确地标识一个包,并且可以在其中编写初始化代码。

b) 执行包的初始化代码

你可以在__init__.py中编写任何Python代码,这些代码在包被导入时就会运行。这通常用于包级别的初始化,例如设置全局变量、导入子模块、提供包的版本信息等。

c) 定义 all 变量
all__变量用于控制当使用from package import *时,哪些模块会被导入。例如,在__init.py中,你可以这样写:

python
all = ["module1", "module2", "subpackage"]

这样,当使用from package import *时,只会导入module1、module2和subpackage。

d) 简化导入路径

你可以在__init__.py中导入包内的模块或函数,这样用户可以直接从包级别导入,而不需要深入到模块级别。例如:

假设你有以下包结构:

text

mypackage/
init .py

module1.py

module2.py

在module1.py中有一个函数fun1,在module2.py中有一个函数fun2。

如果你在__init__.py中写入:

python

from .module1 import fun1

from .module2 import fun2

那么用户可以直接这样导入:

python

from mypackage import fun1, fun2

而不需要:

python

from mypackage.module1 import fun1

from mypackage.module2 import fun2

  1. init .py 的执行时机和次数

当第一次导入包中的任何部分时,init.py会被执行一次。

如果多次导入,init.py不会重复执行,因为Python会缓存已导入的模块。

  1. 示例
    假设我们有一个包结构如下:

text

myapp/
init .py

math.py

string.py

在__init__.py中,我们可以写:

python

print("初始化 myapp 包")

导入包内的模块,使得可以直接从包中导入这些模块的内容

from .math import add, multiply

from .string import capitalize

定义包版本

version = "1.0.0"

控制 from myapp import * 的行为

all = ["add", "multiply", "capitalize"]

在math.py中:

python

def add(a, b):

return a + b

def multiply(a, b):

return a * b

在string.py中:

python

def capitalize(s):

return s.capitalize()

现在,当用户使用这个包时:

python

import myapp # 会打印"初始化 myapp 包"

可以直接使用从__init__.py中导入的函数

result = myapp.add(1, 2)

也可以直接导入函数

from myapp import multiply

result = multiply(3, 4)

使用__all__中定义的导入所有

from myapp import *

result = capitalize("hello") # 可以,因为__all__中包含了capitalize

  1. 注意事项

避免在__init__.py中编写过于耗时的代码,因为这会增加导入时间。

谨慎在__init__.py中导入大量模块,除非你确实需要它们在一开始就可用。

在__init__.py中可以使用相对导入(如上例中的.math)来导入同一包内的模块。

希望这个解释能帮助你理解__init__.py的作用。如果你有更多问题,请随时提问。


澄清:Python的import机制详解

你的问题很好,让我澄清一下这个重要概念。实际上,Python的import既可以导入包,也可以导入目录下的模块文件

import的真实能力

可以导入的内容

  1. 模块(.py文件)
  2. 包(包含__init__.py的目录)
  3. C扩展模块等

实际示例

假设有以下目录结构:

复制代码
project/
    main.py
    utils.py
    helpers/
        __init__.py
        math_utils.py
        file_utils.py
    data/
        config.json  # 普通文件,不是Python模块
        raw_data.txt

main.py中可以导入:

python 复制代码
# 1. 导入同目录的模块文件
import utils                    # ✅ 可以导入
from utils import some_function # ✅ 可以导入

# 2. 导入包
import helpers                  # ✅ 可以导入(因为有__init__.py)
from helpers import math_utils  # ✅ 可以导入

# 3. 导入包中的模块
from helpers.math_utils import add, multiply  # ✅ 可以导入

# 4. 但不能导入非Python文件
import data.config             # ❌ 错误:不是Python模块

关键区别:目录 vs 包

普通目录(没有__init__.py

复制代码
regular_directory/
    some_module.py
    another_module.py
python 复制代码
# 不能直接导入目录本身
import regular_directory  # ❌ ModuleNotFoundError

# 但可以导入目录中的模块!
import regular_directory.some_module  # ✅ 可以导入(Python 3.3+)
from regular_directory import another_module  # ✅ 可以导入

Python包(有__init__.py

复制代码
python_package/
    __init__.py
    some_module.py
    another_module.py
python 复制代码
# 可以导入包本身
import python_package  # ✅ 可以导入(执行__init__.py)

# 也可以导入包中的模块
import python_package.some_module  # ✅ 可以导入
from python_package import another_module  # ✅ 可以导入

Python 3.3+ 的重要变化

命名空间包(Namespace Packages)

在Python 3.3+中,即使目录没有__init__.py,也可以作为"命名空间包"被导入:

python 复制代码
# 目录结构:
# namespace_pkg/
#     module_a.py
#     subdir/
#         module_b.py

# Python 3.3+ 中可以:
import namespace_pkg.module_a          # ✅ 可以导入
import namespace_pkg.subdir.module_b   # ✅ 可以导入

# 但不能:
import namespace_pkg  # ❌ 不能导入目录本身(因为没有__init__.py)

完整的导入能力总结

可以导入的:

python 复制代码
# 1. 同目录的.py文件
import my_module

# 2. 子目录中的.py文件(Python 3.3+)
import subdir.other_module

# 3. 包(有__init__.py的目录)
import my_package

# 4. 包中的模块
import my_package.sub_module

# 5. 标准库模块
import os, sys, math

# 6. 第三方包
import requests, numpy

不能导入的:

python 复制代码
# 1. 非Python文件
import data.txt          # ❌
import config.json       # ❌

# 2. 不存在的模块
import non_existent      # ❌

# 3. 普通目录本身(没有__init__.py)
import regular_directory # ❌(但可以导入其中的模块)

实际工作中的应用

场景1:导入项目模块

复制代码
my_project/
    main.py
    config.py
    utils/
        __init__.py
        logger.py
        validator.py
    tests/
        test_main.py
        test_utils.py

在main.py中:

python 复制代码
import config                    # ✅ 同目录模块
from utils import logger        # ✅ 包中的模块
from utils.validator import validate_data  # ✅ 包中模块的函数

场景2:导入兄弟目录模块

python 复制代码
# 在tests/test_main.py中导入项目代码
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

from main import some_function  # ✅ 现在可以导入
import config                   # ✅ 现在可以导入

场景3:条件导入

python 复制代码
try:
    import fast_library  # 尝试导入优化版本
except ImportError:
    import slow_library as fast_library  # 回退到慢速版本

总结澄清

关键点:

  • Python可以导入目录下的.py文件(模块)
  • __init__.py的目录是"包",可以导入包本身
  • 没有__init__.py的目录是普通目录,不能导入目录本身,但可以导入其中的模块
  • Python 3.3+引入了命名空间包,使得导入更加灵活

所以你的理解需要修正:import完全可以导入当前目录下的其他.py文件__init__.py的主要作用是创建"包"并提供包级别的控制和初始化。


为什么要使用__init__.py?不仅仅是"能用",而是"好用"

你说得对,没有__init__.py也能导入模块。但__init__.py提供的价值在于用户体验、代码组织和工程化。让我用实际场景说明为什么需要它。

用户体验的差异

场景对比:没有 vs 有 __init__.py

没有 __init__.py 的情况:

python 复制代码
# 用户需要知道内部结构
from my_package.data.readers.csv_reader import read_csv
from my_package.data.processors.cleaner import clean_data
from my_package.data.writers.json_writer import write_json
from my_package.utils.validators import validate_schema

# 使用
data = read_csv("input.csv")
cleaned = clean_data(data)
if validate_schema(cleaned):
    write_json(cleaned, "output.json")

__init__.py 优化后的情况:

python 复制代码
# 用户只需要导入包,使用清晰的API
from my_package import read_csv, clean_data, write_json, validate_schema

# 或者更简洁的
import my_package as mp

# 使用
data = mp.read_csv("input.csv")
cleaned = mp.clean_data(data)
if mp.validate_schema(cleaned):
    mp.write_json(cleaned, "output.json")

__init__.py 的核心价值

1. 提供清晰的公共API

python 复制代码
# my_package/__init__.py
from .data.readers.csv_reader import read_csv
from .data.processors.cleaner import clean_data
from .data.writers.json_writer import write_json
from .utils.validators import validate_schema

# 明确告诉用户哪些是公共接口
__all__ = ['read_csv', 'clean_data', 'write_json', 'validate_schema']

2. 隐藏实现细节

python 复制代码
# 没有 __init__.py,用户可能误用内部模块
from my_package.internal._deprecated_module import old_function  # ❌ 不应该这样

# 有 __init__.py,可以控制暴露的接口
# 用户只能使用我们设计好的公共API

3. 包级别初始化和配置

python 复制代码
# my_package/__init__.py
import logging

# 包级别的配置
__version__ = "1.0.0"
DEBUG = False

# 初始化日志系统
logging.getLogger(__name__).addHandler(logging.NullHandler())

# 验证依赖
try:
    import pandas
except ImportError:
    raise ImportError("my_package requires pandas. Install with: pip install pandas")

def set_debug(debug=True):
    """包级别的调试设置"""
    global DEBUG
    DEBUG = debug

实际工程案例

案例1:机器学习工具包

复制代码
ml_toolkit/
    __init__.py           # 提供统一的API入口
    data/
        __init__.py       # 数据处理的统一接口
        loaders.py
        preprocessors.py
        augmentations.py
    models/
        __init__.py       # 模型管理的统一接口  
        classifiers.py
        regressors.py
    utils/
        __init__.py       # 工具函数的统一接口
        metrics.py
        visualization.py

ml_toolkit/__init__.py:

python 复制代码
# 统一的高级API
from .data import load_dataset, preprocess_data, augment_data
from .models import create_classifier, create_regressor
from .utils import calculate_metrics, plot_results

__all__ = [
    'load_dataset', 'preprocess_data', 'augment_data',
    'create_classifier', 'create_regressor', 
    'calculate_metrics', 'plot_results'
]

# 包信息
__version__ = "2.1.0"

用户使用体验:

python 复制代码
import ml_toolkit as ml

# 清晰的API,不需要知道内部结构
data = ml.load_dataset("iris")
processed = ml.preprocess_data(data)
model = ml.create_classifier("random_forest")
metrics = ml.calculate_metrics(model, processed)
ml.plot_results(metrics)

案例2:Web框架插件

python 复制代码
# 没有 __init__.py 的插件使用
from my_plugin.database.connectors.mysql import MySQLConnector
from my_plugin.auth.providers.oauth2 import OAuth2Provider
from my_plugin.api.routes.users import user_routes
from my_plugin.middleware.auth import auth_middleware

# 有 __init__.py 的插件使用
from my_plugin import MySQLConnector, OAuth2Provider, user_routes, auth_middleware

什么时候可以不用 __init__.py

适合省略的情况:

python 复制代码
# 1. 简单的脚本项目
scripts/
    backup.py
    deploy.py
    monitor.py
# 这些文件彼此独立,不需要统一的包接口

# 2. 测试目录
tests/
    test_module1.py
    test_module2.py
# 测试文件通常由测试运行器直接执行

# 3. 配置文件目录
config/
    development.py
    production.py
    testing.py

必须使用的情况:

python 复制代码
# 1. 要发布到PyPI的库
my_awesome_library/
    __init__.py           # 必须!提供公共API

# 2. 大型项目的子模块
project/
    core/
        __init__.py       # 提供核心API
    plugins/
        __init__.py       # 插件管理接口
    utils/
        __init__.py       # 工具函数集合

工程化优势

1. 版本管理

python 复制代码
# my_package/__init__.py
__version__ = "1.2.3"
__version_info__ = (1, 2, 3)

def get_version():
    return __version__

2. 依赖检查和初始化

python 复制代码
# my_package/__init__.py
import sys

# 检查Python版本
if sys.version_info < (3, 7):
    raise RuntimeError("This package requires Python 3.7 or later")

# 初始化全局状态
_CONFIG = {}

def configure(**settings):
    global _CONFIG
    _CONFIG.update(settings)

3. 向后兼容性

python 复制代码
# my_package/__init__.py
import warnings

# 从旧位置导入,但发出弃用警告
from .new_location import NewClass

def OldClass(*args, **kwargs):
    warnings.warn(
        "OldClass is deprecated, use NewClass instead",
        DeprecationWarning,
        stacklevel=2
    )
    return NewClass(*args, **kwargs)

总结:为什么需要 __init__.py

场景 没有 __init__.py __init__.py
用户体验 需要了解内部结构 简洁统一的API
代码维护 散乱的导入 集中的接口管理
版本控制 难以管理 明确的版本信息
依赖管理 运行时才发现问题 导入时检查依赖
API稳定性 用户可能误用内部模块 明确的公共接口
文档生成 难以生成完整文档 清晰的包级别文档

核心思想: __init__.py 不是为了"能用",而是为了:

  • 更好的开发者体验
  • 更清晰的架构设计
  • 更稳定的API契约
  • 更专业的工程实践

对于个人小脚本,确实可以不用。但对于要分享、维护、扩展的代码,__init__.py 是专业Python开发的重要工具。

相关推荐
CNRio3 小时前
ZUC国密算法深度研究:原理、实现与应用(Python、Rust)
python·算法·rust
Python大数据分析@3 小时前
数据分析为什么常用Jupyter而不是直接使用Python脚本或Excel?
python·jupyter·数据分析
一株菌子3 小时前
10.9总结
开发语言·python
o***Z4484 小时前
Python包管理工具
开发语言·python
虹科网络安全4 小时前
艾体宝干货 | Redis Python 开发系列#4 保证原子性与性能
redis·python·junit
G***T6914 小时前
Python混合现实案例
python·pygame·mr
FreeCode5 小时前
LangGraph1.0智能体开发:选择API
python·langchain·agent
好学且牛逼的马5 小时前
【Java编程思想|15-泛型】
java·windows·python
G***T6915 小时前
Python项目实战
开发语言·python