检查参数TypeError而不执行它

时间:2016-01-14 06:06:15

标签: python python-3.x compilation

关于以下代码,如何在执行之前了解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

2 个答案:

答案 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},上面的代码将会起作用这需要位置参数(任意数量的参数),所以就是这样,希望它有所帮助。