EMP*_*EMP 1 python dynamic-typing
我仍然是Python的新手,我正在尝试习惯它的动态类型.有时我有一个函数或类需要某个类型的参数,但是可以得到另一个类型的值,它可以强制它.例如,它可能期望a float而是接收int或decimal.或者它可能需要一个字符串,而是接收一个定义__str__特殊方法的对象.
将论证强制转换为正确的类型(及其原因)的最佳做法是什么?我是在函数/类中还是在调用者中执行此操作?如果在调用者中,我是否也在函数中检查它?例如.
备选方案1:
def myfunc(takes_float):
myval = float(takes_float)
myfunc(5)
Run Code Online (Sandbox Code Playgroud)
备选方案2:
def myfunc(takes_float):
myval = takes_float
myfunc(float(5))
Run Code Online (Sandbox Code Playgroud)
备选方案3:
def myfunc(takes_float):
assert isinstance(takes_float, float)
myval = takes_float
myfunc(float(5))
Run Code Online (Sandbox Code Playgroud)
我已经读这个答案和这一次,他们说,在Python检查类型是"坏"的,但我不想把时间浪费在追踪非常简单的错误,这些错误会在静态类型被立即拾起编译器语言.
你"强迫"(也许 - 它可能是一个noop),当你这样做是必不可少的时候,而不是更早.例如,假设您有一个函数,它接受一个浮点函数并返回其正弦和余弦的总和:
import math
def spc(x):
math.sin(x) + math.cos(x)
Run Code Online (Sandbox Code Playgroud)
你应该在哪里"胁迫"x浮动?答:无处可去 - 罪和cos为你做这项工作,例如:
>>> spc(decimal.Decimal('1.9'))
0.62301052082391117
Run Code Online (Sandbox Code Playgroud)
那么当强制(尽可能晚)是不可或缺的时候?例如,如果你想在一个参数上调用字符串方法,你必须确保它是一个字符串 - 尝试调用例如.lower非字符串将不起作用,len可能会工作,但做一些不同于你期望的事情,如果arg是一个列表(给你列表中的项目数,而不是它表示为字符串的字符数),依此类推.
至于捕获错误 - 认为单元测试 - 半单元测试将捕获静态类型的所有错误,然后一些.但是,这是一个不同的主题.
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |