Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中强制/转换为正确类型的最佳位置_Python_Dynamic Typing - Fatal编程技术网

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

在Python中强制/转换为正确类型的最佳位置,python,dynamic-typing,Python,Dynamic Typing,我对Python还是相当陌生的,我正在尝试适应它的动态类型。有时,我有一个函数或类,它需要一个特定类型的参数,但可以得到另一个可强制的类型的值。例如,它可能需要一个浮点值,但会收到一个int或十进制值。或者它可能需要一个字符串,但接收一个定义\uuu str\uu特殊方法的对象 将参数强制为正确类型的最佳实践是什么(及其原因)?我是在函数/类中还是在调用方中执行此操作?如果在调用者中,我是否也在函数中检查它?例如 备选方案1: def myfunc(takes_float): myval

我对Python还是相当陌生的,我正在尝试适应它的动态类型。有时,我有一个函数或类,它需要一个特定类型的参数,但可以得到另一个可强制的类型的值。例如,它可能需要一个
浮点值
,但会收到一个int或十进制值。或者它可能需要一个字符串,但接收一个定义
\uuu str\uu
特殊方法的对象

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

备选方案1:

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

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

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

myfunc(float(5))
备选方案2:

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

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

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

myfunc(float(5))
备选方案3:

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

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

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

myfunc(float(5))
我已经读过,他们说Python中的类型检查是“不好的”,但我不想浪费时间跟踪非常简单的错误,这些错误会被编译器在静态类型语言中立即发现。

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

import math
def spc(x):
  math.sin(x) + math.cos(x)
你应该在哪里“强制”x浮动?回答:根本没有——罪恶和罪恶为你做那件事,例如:

>>> spc(decimal.Decimal('1.9'))
0.62301052082391117
那么,什么时候强制(尽可能晚)是必不可少的呢?例如,如果你想对一个参数调用string方法,你必须确保它是一个字符串——尝试调用非字符串的
。lower
将不起作用,
len
可能会起作用,但如果arg是一个列表,则执行与预期不同的操作(给出列表中的项目数,而不是它作为字符串的表示将占用的字符数),依此类推

至于捕获错误--想想--半体面单元测试将捕获所有错误,然后是一些错误。但是,这是另一个主题。

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

import math
def spc(x):
  math.sin(x) + math.cos(x)
你应该在哪里“强迫”x浮动?回答:没有任何地方——罪和因为你做这项工作,例如:

>>> spc(decimal.Decimal('1.9'))
0.62301052082391117
因此,当强制(尽可能晚)是必不可少的时候?例如,如果你想对一个参数调用string方法,你必须确保它是一个字符串——尝试对非字符串调用例如
。lower
将不起作用,
len
可能起作用,但如果arg是一个列表,则执行与你预期不同的操作(给出列表中的项目数,而不是它作为字符串的表示将占用的字符数),依此类推


至于捕获错误——想想——半体面单元测试将捕获所有错误,然后是一些错误。但是,这是另一个主题。

这真的取决于情况。你为什么需要一个
浮点值呢?
int
会破坏函数吗?如果是,为什么

如果您需要参数来支持
float
具有但
int
不具有的函数/属性,则应检查该函数/属性,而不是该参数恰好是
float
。检查对象是否可以执行您需要的操作,而不是您熟悉的特定类型h

谁知道呢,也许有人会发现Python对
float
的实现存在一些主要问题,并创建一个
notbrokenfloat
库。它可能支持float在修复一些外来bug时所做的一切,但其对象不会是
float
类型。手动将其转换为
float
可能会删除所有错误他从这个漂亮的新班级中获益(或者可能彻底崩溃)


是的,这是一个不太可能的例子,但我认为在使用动态类型语言时,这是一种正确的心态。

这真的要视情况而定。你为什么需要一个
float
?一个
int
会破坏函数吗?如果是,为什么

如果您需要参数来支持
float
具有但
int
不具有的函数/属性,则应检查该函数/属性,而不是该参数恰好是
float
。检查对象是否可以执行您需要的操作,而不是您熟悉的特定类型h

谁知道呢,也许有人会发现Python对
float
的实现存在一些主要问题,并创建一个
notbrokenfloat
库。它可能支持float在修复一些外来bug时所做的一切,但其对象不会是
float
类型。手动将其转换为
float
可能会删除所有错误他从这个漂亮的新班级中获益(或者可能彻底崩溃)


是的,这是一个不太可能的例子,但我认为在使用动态类型语言时,这是正确的思维方式。

只有一次整数与浮点值会出现问题。这是唯一一次你会发现一个奇怪的“简单”bug,并且是调试的挑战

分部

当你需要转换时,其他的一切都会满足你的需要

如果您使用的是Python2.x,并且未经思考就随意抛出
/
操作符,那么在某些常见情况下,您可能会做错事

你有几个选择

  • 来自未来导入分部的
    将为您提供分部的Python 3语义

  • 始终使用
    -Qnew
    选项运行以获取新的分区语义

  • /
    操作附近使用
    float

  • 除法是唯一一个影响类型的地方。它是唯一一次整数与浮点数的行为不同,从而默默地影响结果

    所有其他类型不匹配问题都将失败