【问题标题】:Methods, types and Python [duplicate]方法、类型和 Python [重复]
【发布时间】:2015-06-19 07:02:13
【问题描述】:

在 Python 中方法有点奇怪,至少与其他语言相比。一个函数,比如在 C++ 中,是这样的:

void foo(int i){
    cout << i*2 << "\n";
}

这确保传递给该函数的对象实际上是一个整数。然而,在 Python 中,相同的函数如下所示:

def foo(i):
    print i*2

这个函数不需要i 是一个整数,更不用说一个数字了。你甚至可以传入一个字符串。所以我的问题是:编写代码时处理这个问题的一般方法是什么?一般来说,检查类型并在使用不正确时抛出错误消息更好,还是宁愿不检查并假设已通过正确的类型?

【问题讨论】:

  • 你读过例如docs.python.org/3/glossary.html#term-duck-typing?也有很多关于 SO 的相关问题:stackoverflow.com/q/11328920/3001761 是一个开始。
  • 另外,检查类型并抛出错误是毫无意义的,因为如果类型不兼容,它无论如何都会抛出错误。
  • 您似乎从未听说过动态类型语言。 Python 并不是唯一的一个:Javascript 和 Ruby 是您可能会遇到的另外两个,但还有更多。
  • 甚至不检查类型 - 只做计算。如果您认为它可能会失败(例如,由于接受用户输入),请try 它并在失败时捕获错误,因为请求宽恕比请求许可更容易。
  • 对于建议“输入错误就让它自然失败”的用户,错误的输入可能会产生异常输出而不是崩溃。例如,foo("42") 将打印“4242”而不是引发 TypeError 或其他任何内容。

标签: python


【解决方案1】:

这是主观的。确保您的参数类型正确的最简单方法是使用 assert 语句 - 在您的示例中,类似于 assert isinstance(i, int), "foo expects an int!" 但这并不是绝对必要的 - 如果它不会使用错误的参数运行,同样会报错。

简而言之,做最能帮助您调试的事情。

【讨论】:

  • 只是补充一下,如果您更喜欢比assertisinstance 更快的速度,请使用type(object) 提高可读性或使用object.__class__ 提高性能。
【解决方案2】:

使用 Python,您希望通过以下方式验证输入来处理这种情况:

try:
   val = int(userInput)
except ValueError:
   print("That's not an int!")

这是试图将用户输入转换为整数,如果无法转换,则会抛出 ValueError。

【讨论】:

  • 这个答案有什么问题?
  • 你可以在python中这样检查错误,因为在c++和其他静态语言中,如果传递给函数的值不是整数,它仍然会抛出异常
  • 您似乎在回答“如何判断字符串是否可以成功转换为整数?”的问题。当 OP 询问“我如何判断变量是否是我认为的类型?”时。 “int(x) 不会崩溃”并不意味着“x 是一个 int”。
  • 我认为这个想法可能是检查某些东西是否足够接近 int 以传递给 foo() 以获得预期结果。
  • 其实这抑制ValueError;那么当val 之后被用作int 时会发生什么?
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2019-02-08
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多