为什么 typeguard 不对函数进行类型检查?
该函数无需使用
@typechecked
装饰器即可工作。运行它会发出警告,指出未执行类型检查。
from typeguard import typechecked
@typechecked
def my_func(x, y):
z = x + y
return z
a = my_func(1, 2)
print(a)
(venv) me@ubuntu-pcs:~/PycharmProjects/project$ python3 foo/bar.py
/home/me/miniconda3/envs/venv/lib/python3.9/site-packages/typeguard/__init__.py:1016: UserWarning: no type annotations present -- not typechecking __main__.my_func
warn('no type annotations present -- not typechecking {}'.format(function_name(func)))
1 2
None
该问题源于你对
@typechecked
装饰器的使用范围存在误解。你在代码中用
@typechecked
装饰了
my_func
函数,但这仅表示 typeguard 会检查
my_func
函数内部
的类型注释,而不会检查调用该函数时传入的参数类型。
警告信息 "no type annotations present -- not typechecking
main
.my_func" 指的是
my_func
函数本身没有类型注释,而不是指调用它时传入的参数。
为了让 typeguard 检查
my_func
函数的参数类型,你需要:
- 为函数参数和返回值添加类型提示:
```python from typeguard import typechecked
@typechecked def my_func(x: int, y: int) -> int: z = x + y return z
a = my_func(1, 2) print(a) ```
- 在调用函数时传入错误类型的参数:
例如,尝试传入字符串而不是整数:
python
a = my_func("1", 2) # 传入字符串 "1"
此时,typeguard 会检测到类型错误并抛出异常。
总结:
-
@typechecked
装饰器用于检查 函数内部 的类型注释。 - 要让 typeguard 检查函数参数类型,你需要 为函数参数和返回值添加类型提示 ,并在调用函数时传入错误类型的参数以触发类型检查。