Python Duck类型numpy float类型
我正在编写一个用于msgpack python的自定义编码函数。在让msgpack python序列化之前,我希望将任何numpy.float对象转换为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 这很好用。然而,在上一次投票中得票最多的答案表明,这是一个坏主意。我认为这是因为
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
只是另一个名字