python - 在 Python 中强制/转换为正确类型的最佳位置

标签 python dynamic-typing

我对 Python 还是很陌生,我正在努力适应它的动态类型。有时我有一个函数或一个类需要一个特定类型的参数,但可以获得另一个类型的值,它可以强制转换。例如,它可能需要一个 float,但却收到一个 int 或 decimal。或者它可能需要一个字符串,但却接收到一个定义了 __str__ 特殊方法的对象。

将参数强制转换为正确类型(及其原因)的最佳做法是什么?我是在函数/类中还是在调用者中执行此操作?如果在调用者中,我是否也在函数中检查它?例如。

备选方案 1:

def myfunc(takes_float):
    myval = float(takes_float)

myfunc(5)

备选方案 2:

def myfunc(takes_float):
    myval = takes_float

myfunc(float(5))

备选方案 3:

def myfunc(takes_float):
    assert isinstance(takes_float, float)
    myval = takes_float

myfunc(float(5))

我已经读过 this answerthis one他们说在 Python 中检查类型是“糟糕的”,但我不想浪费时间追踪非常简单的错误,这些错误会立即被静态类型语言的编译器发现。

最佳答案

当您必须这样做时,您就“强制”(也许——这可能是一个 noop),而不是更早。例如,假设您有一个接受 float 并返回其正弦和余弦之和的函数:

import math
def spc(x):
  math.sin(x) + math.cos(x)

你应该在哪里“强制”x float ?回答:根本无处可去——sin 和 cos 会为你完成这项工作,例如:

>>> spc(decimal.Decimal('1.9'))
0.62301052082391117

那么什么时候强制执行是必不可少的(越晚越好)?例如,如果你想在一个参数上调用字符串方法,你必须确保它是一个字符串——尝试调用例如.lower 对非字符串无效,len 可能有效,但如果 arg 是例如一个列表(给你列表中的项目数,而不是它作为字符串的表示所占用的字符数),等等。

至于捕获错误——想想unit tests -- 半体面的单元测试将捕获所有静态类型错误,然后是一些。但是,那是另一回事了。

关于python - 在 Python 中强制/转换为正确类型的最佳位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912476/

相关文章:

python - httpd.conf : Cannot load modules/mod_wsgi. 中的语法错误 : libpython2. 7.so.1.0: 无法打开共享对象文件 No such file or directory

python - 联合类型实际上存在于 python 中吗?

python - PyQt - 通过代码管理变量名称和值

python - 查看来自 PID != 1 的日志

python - Python 类型安全吗?

python - 如何使用动态类型进行保护

C++类设计: dynamic typing alternative to template argument?

language-agnostic - 弱类型相对于强类型的优势

python - 添加 z3 约束,使 z3 变量的值等于某个函数的返回值

Python 计算器 - 使用 3 个数字时出现问题