函数表达式作为模块属性是指在.py文件顶层用def或lambda定义并赋值的函数,自动成为模块命名空间中的可导出对象,可通过“模块名.函数名”访问,本质是向module.__dict__注册键值对。

函数表达式可以作为模块属性直接定义在模块顶层,它本质上是将一个函数对象赋值给模块级别的变量名,从而成为该模块对外暴露的可调用接口。
什么是函数表达式作为模块属性
这不是指 lambda 表达式,而是把 def 定义的函数 或 lambda 创建的函数对象 赋值给模块级变量。只要定义在 .py 文件的最外层(不在类或函数内部),它就自动成为模块的属性,可通过 import 模块名 后用 模块名.函数名 访问。
例如:
# math_utils.py
def add(a, b):
return a + b
multiply = lambda x, y: x * y
PI = 3.14159
其中 add、multiply 和 PI 都是 math_utils 模块的属性——前两者是函数类型,后者是数值类型。
为什么函数能成为模块属性
Python 中模块就是一个特殊的对象(module 类型),它的命名空间本质上是一个字典(module.__dict__)。所有在模块顶层执行的赋值语句,都会写入这个字典。
-
def func(): ...实际上等价于func = function object,即向模块命名空间注册一个键值对 -
multiply = lambda ...是显式赋值,效果完全一致 - 这些名字在模块被导入时,就成为模块对象的属性,支持点号访问
常见使用方式与注意事项
模块中定义函数作为属性,是组织代码最自然的方式,但需注意几点:
- 函数必须定义在模块顶层,嵌套在其他函数或类里的函数不会自动成为模块属性
- 模块属性名遵循 Python 变量命名规则:只能含字母、数字、下划线,不能以数字开头
- 若想控制哪些属性对外可见,可在模块末尾定义
__all__ = ["add", "multiply"],避免意外导出内部辅助函数 - 模块属性在导入时即被创建,不依赖手动调用;而函数体内的局部变量不属于模块属性
和普通变量属性的区别
从模块角度看,函数和其他变量没有本质区别——都是绑定到模块命名空间的对象:
-
count = 0→ 模块属性,类型为int -
greet = lambda name: f"Hello, {name}"→ 模块属性,类型为function -
class Config:→ 模块属性,类型为type
它们统一通过 模块名.属性名 访问,只是行为不同:调用函数、读取数值、实例化类等。

















