Best place to coerce/convert to the right type in Python
我对python还比较陌生,我正在尝试适应它的动态类型。有时我有一个函数或类,它需要某个特定类型的参数,但可以得到另一个可强制使用的类型的值。例如,它可能期望得到一个
将参数强制为正确类型(及其原因)的最佳实践是什么?我是在函数/类中还是在调用方中执行此操作?如果在调用者中,是否还要在函数中检查它?如。
替代方案1:
1 2 3 4 | def myfunc(takes_float): myval = float(takes_float) myfunc(5) |
替代方案2:
1 2 3 4 | def myfunc(takes_float): myval = takes_float myfunc(float(5)) |
替代方案3:
1 2 3 4 5 | def myfunc(takes_float): assert isinstance(takes_float, float) myval = takes_float myfunc(float(5)) |
我已经读过这个答案和这个答案,他们说在python中检查类型是"不好的",但是我不想浪费时间跟踪非常简单的错误,这些错误会立即被编译器以静态类型语言发现。
你"强迫"(也许--这可能是一个中午)当它是你必须这样做,而不是更早。例如,假设有一个函数接受一个浮点值并返回其正弦和余弦的和:
1 2 3 | import math def spc(x): math.sin(x) + math.cos(x) |
你应该"强迫"X浮在哪里?答:根本就没有地方——罪和罪是为你做的,例如:
1 2 | >>> spc(decimal.Decimal('1.9')) 0.62301052082391117 |
那么,何时必须强制(尽可能晚)呢?例如,如果要对参数调用String方法,则必须确保它是一个字符串--尝试对非字符串调用例如
至于捕获错误——想想单元测试——半正派的单元测试将捕获静态类型会捕获的所有错误,然后是一些错误。但是,这是另一个主题。
这要看情况而定。为什么你需要一个
如果需要参数来支持
谁知道呢,也许有人会发现Python实现
是的,这是一个不太可能的例子,但我认为这是在使用动态类型语言时要进入的正确心态。
只有一次整型和浮点型会出现问题。这是唯一一次你会发现一个"简单"的错误,它很奇怪,并且是调试的挑战。
除法。
当你需要的时候,其他的一切都会完成你需要的转换。
如果您使用的是python 2.x,并且在不经意间随意地使用
你有几个选择。
始终使用
在
划分是唯一能影响类型的地方。这是唯一一次整数的行为与浮点数的行为不同,而浮点数的方式会无声地影响结果。
所有其他类型的不匹配问题都将以
更具体一点。
没有调试"Expect a string but no t get a string"。这将立即崩溃,并具有追溯功能。没有混乱。没有时间浪费思考。如果函数需要一个字符串,那么调用方必须提供该字符串——这就是规则。
上面的备选方案2很少用于解决这样一个问题:您有一个函数需要一个字符串,而您感到困惑,忘记提供一个字符串。这种错误很少发生,并且会导致立即类型异常。