Python Duck类型numpy float类型

Python Duck类型numpy float类型,python,numpy,floating-point,subclass,duck-typing,Python,Numpy,Floating Point,Subclass,Duck Typing,我正在编写一个用于msgpack python的自定义编码函数。在让msgpack python序列化之前,我希望将任何numpy.float对象转换为float。我的编码函数如下所示: def encode_custom(obj): if issubclass(obj.__class__,np.float): obj = float(obj) return obj 这很好用。然而,在上一次投票中得票最多的答案表明,这是一个坏主意。我认为这是因为

我正在编写一个用于msgpack python的自定义编码函数。在让msgpack python序列化之前,我希望将任何numpy.float对象转换为float。我的编码函数如下所示:

def encode_custom(obj):        
    if issubclass(obj.__class__,np.float):
        obj = float(obj)
    return obj
这很好用。然而,在上一次投票中得票最多的答案表明,这是一个坏主意。我认为这是因为这个方法不使用duck类型

有没有办法鸭式键入编码函数


编辑:请注意,我只希望类似于float的对象转换为float。更好地表示为另一种类型(例如ints)的对象应该使用该另一种类型,即使它们可以被
float()
”转换为float对象。

您可以调用将NumPy标量转换为Python标量的NumPy例程之一:

try:
    return obj.item()
except AttributeError:
    return obj

请注意,最好只使用
isinstance(obj,numpy.float64)
,或
isinstance(obj,(numpy.float32,numpy.float64))
。Duck类型对于像iterables这样的东西是有意义的,在那里你试图把它们当作iterables,如果它起作用,你知道它们是iterables。在这里你试着把你的对象当作一个numpy标量,如果它有效,你知道。。。对象具有
方法或
列表
方法。这不是你真正感兴趣的信息


如果您想检查对象是否具有实际的特定类型,而不是检查它提供了什么操作,
isinstance
通常是一种方法。

您可以调用其中一个将NumPy标量转换为Python标量的NumPy例程:

try:
    return obj.item()
except AttributeError:
    return obj

请注意,最好只使用
isinstance(obj,numpy.float64)
,或
isinstance(obj,(numpy.float32,numpy.float64))
。Duck类型对于像iterables这样的东西是有意义的,在那里你试图把它们当作iterables,如果它起作用,你知道它们是iterables。在这里你试着把你的对象当作一个numpy标量,如果它有效,你知道。。。对象具有
方法或
列表
方法。这不是你真正感兴趣的信息


如果您想检查对象是否具有实际的特定类型,而不是检查它提供了什么操作,
isinstance
通常是一种方法。

任何python问题的第一个答案都是“它取决于”。使用duck类型,您只需假设对象是正确的,并在出现问题时捕获异常。在您的情况下,这将是:

def encode_custom(obj):
    """Strict type checking: change to float, but raise ValueError
    on fail and let upper level deal with it."""
    return float(obj)

def encode_custom(obj):
    """Loose type checking: change to float or return unchanged"""
    try:
        return float(obj)
    except ValueError:
        return obj
这将适用于各种浮动以及可以转换为浮动的所有内容。类似于
np.int16
np.bool\u
str
(如果它恰好表示int或float)。现在谈谈“视情况而定”。如果您希望所有这些内容都被隐藏,或者如果您的程序将这些非浮点内容定义为垃圾,并且您希望出错,那么这非常好

在这种情况下,检查实例而不是检查子类,这样您就可以处理正在进行的任何奇怪的多重继承或元编程

def encode_custom(obj):        
    if isinstance(obj,np.float):
        obj = float(obj)
    return obj

任何python问题的头号答案都是“视情况而定”。使用duck类型,您只需假设对象是正确的,并在出现问题时捕获异常。在您的情况下,这将是:

def encode_custom(obj):
    """Strict type checking: change to float, but raise ValueError
    on fail and let upper level deal with it."""
    return float(obj)

def encode_custom(obj):
    """Loose type checking: change to float or return unchanged"""
    try:
        return float(obj)
    except ValueError:
        return obj
这将适用于各种浮动以及可以转换为浮动的所有内容。类似于
np.int16
np.bool\u
str
(如果它恰好表示int或float)。现在谈谈“视情况而定”。如果您希望所有这些内容都被隐藏,或者如果您的程序将这些非浮点内容定义为垃圾,并且您希望出错,那么这非常好

在这种情况下,检查实例而不是检查子类,这样您就可以处理正在进行的任何奇怪的多重继承或元编程

def encode_custom(obj):        
    if isinstance(obj,np.float):
        obj = float(obj)
    return obj

这里的特殊大小写类型是完全合理的——因为听起来好像您正在将它输入到一个API中,而这个API无论如何都不能与duck类型一起工作

但正如其他地方提到的,
np.float是float
,所以这不起作用。您可能需要
isinstance(val,np.floating)
,或者
isinstance(val,np.increact)

为了便于将来参考,如果您想知道整个类层次结构(不包括
abc
s)是什么,可以使用
\uuuuuumro\uuuuuu
属性获取:

>>> np.float32.__mro__
(<class 'numpy.float32'>, <class 'numpy.floating'>, <class 'numpy.inexact'>, <class 'numpy.number'>, <class 'numpy.generic'>, <class 'object'>)
>>np.float32.\uuu mro__
(, , , )

特殊大小写这里的类型是非常合理的-因为听起来好像你把它输入了一个无论如何都不能用duck类型工作的API

但正如其他地方提到的,
np.float是float
,所以这不起作用。您可能需要
isinstance(val,np.floating)
,或者
isinstance(val,np.increact)

为了便于将来参考,如果您想知道整个类层次结构(不包括
abc
s)是什么,可以使用
\uuuuuumro\uuuuuu
属性获取:

>>> np.float32.__mro__
(<class 'numpy.float32'>, <class 'numpy.floating'>, <class 'numpy.inexact'>, <class 'numpy.number'>, <class 'numpy.generic'>, <class 'object'>)
>>np.float32.\uuu mro__
(, , , )

尝试:返回浮点值(obj),ValueError除外:返回obj
@SethMMorton,它也将整数转换为浮点值。在某些情况下,这是个坏主意。您已经明确表示要转换numpy浮点,所以这看起来很好。但是我建议只使用
isinstance(obj,np.float)
。仅供参考:
numpy.float
只是Python内置
float
的另一个名称。如果每个人都使用
float
而不是
np.float
try:return float(obj),则会更清楚,ValueError:return obj
@SethMMorton也会将整数转换为float。在某些情况下,这是个坏主意。您已经明确表示要转换numpy浮点,所以这看起来很好。但是我建议只使用
isinstance(obj,np.float)
。仅供参考:
numpy.float
只是Python内置
float
的另一个名称。如果每个人都使用
float
而不是
np.float
,那就更清楚了。请注意
np.float
只是另一个名字