【问题标题】:writing code for exception TypeError in python在python中为异常TypeError编写代码
【发布时间】:2017-07-09 15:42:02
【问题描述】:

我有一个看起来像这样的函数:

def fun(a,b,c=None): pass

当我在 python 3 中将此函数称为 fun(1) 时,它给我的错误为 TypeError: fun() missing 1 required positional argument: 'b',这是可以理解的,但是当我在 python 2 中调用此函数时,它给我的错误为 TypeError: fun() takes at least 2 arguments (1 given)

所以我想在 python 2 中捕获这个错误,因为它在 python 3 中被捕获而不切换到 python 3。我怎样才能实现这一点?另外,如果我为此编写装饰器,我需要在装饰器之外保留函数的签名。

【问题讨论】:

  • 错误的类型没有区别,只是消息不同。默认消息在C 中定义,无法直接通过 Python 进行更改。您可以在 Python 2 中捕获异常并在 Python 3 中使用类似的异常消息重新引发它(但这需要大量自省调用堆栈和函数对象以在调用中找到丢失的 arg)。
  • 我是 python 新手。你能建议我做点什么吗? @JimFasarakis-Hilliard
  • 诚实吗?只是不要使用 Python 2 是最好的建议。但是,由于此决定可能不是您的决定,因此您可以随时查看 stdlib 中的 inspect 模块,该模块提供的自省功能应该有助于您实现目标。
  • 谢谢。我会调查的

标签: python-2.7 python-3.x typeerror python-decorators


【解决方案1】:

你想达到什么目的? python2和python3都抛出'TypeError',这意味着调用者滥用了'fun'函数

def foo(a, b, c = None):
    pass

try:
    foo(1)
except TypeError:
    print("TypeError")

为 python2 调用它:

python2 code_for_exception_type_error.py
TypeError

还有python3:

python3 code_for_exception_type_error.py
TypeError

【讨论】:

  • 我正在使用python2。在我的模块中,我有一个类似上面的功能。现在,当其他人使用不正确参数的模块的这个函数(上面写的很有趣)时,我想抓住那个东西并写一条消息,显示缺少哪个位置参数。 Python3 在内部处理这件事,但不是 python 2。那么我怎样才能在 python2 中做这件事并用消息抛出我的自定义错误。我希望我现在清楚了。
【解决方案2】:

您收到此错误的原因是您没有为参数“b”传递值。如果您不想为“b”传递值,请执行以下操作:

def fun(a, b = None, c = None):
    pass

fun(1)   

如果要为参数 b 传递值,请执行以下操作:

def fun(a, b, c = None):
    pass

bValue = None # whatever you want to pass for b
fun(1, bValue)  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多