关于以下代码,如何在执行之前了解TypeError
?有可能吗?
我的p.py
脚本:
class X:
def __init__(self, **kwargs):
pass
x = X(1)
当我编译它时,它不会引发任何错误:
LM-SHC-00950567:test$ python -m py_compile p.py
LM-SHC-00950567:test$ python -m compileall p.py
但是当我执行它时,它会:
LM-SHC-00950567:test$ python p.py
Traceback (most recent call last):
File "p.py", line 7, in <module>
x = X(1)
TypeError: __init__() takes 1 positional argument but 2 were given
答案 0 :(得分:1)
如何在执行之前知道TypeError?有可能吗?
仅限mypy
,否,您不能。 Python 是动态语言,不是静态语言。它不执行任何检查以确定在执行之前是否有错误,它只是执行。如果你像你一样犯了概念错误,那是你的错。
当然,您可以使用静态检查工具。最近由于类型提示而引起关注的一个候选者是mypy
,这是一个静态检查器,除了其他很酷的东西之外,它还能捕获这些错误。
在脚本上运行(Python3)jim@jim: mypy p.py
p.py:6: error: Too many arguments for "X"
会产生:
try
所以它在不需要执行的情况下抓住了它。
一般来说,执行这样的检查不是python的意思。在python中,我们先except
并稍后捕获p.py
个离子( EAFP
原则)。例如,如果您的print(X.i)
脚本有AttributeError
形式的行,这是明显的try-except
,而不是检查它,最好将其包装在try:
print(X.i)
except AttributeError:
print("X has no attribute i")
中}:
{{1}}
答案 1 :(得分:0)
如果您了解语言结构,则可以:
例如在python中如果你使用**kwargs
python希望你在创建该类的对象时用keyword arguments
调用该类,例如x = X(value = 25)
如果使用{{1},上面的代码将会起作用这需要位置参数(任意数量的参数),所以就是这样,希望它有所帮助。