Skip to main content
 首页 » 编程设计

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

2025年05月04日10落叶无声

我对 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 -- 半体面的单元测试将捕获所有静态类型错误,然后是一些。但是,那是另一回事了。