我对 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 answer和 this 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/