Duck-typing numpy float类型

2024-10-03 15:26:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个用于msgpackpython的自定义编码函数。我想把任何浮点数对象在让msgpack python序列化它之前浮动。我的编码函数如下所示:

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

效果很好。然而,在How do I check (at runtime) if one class is a subclass of another?的最高投票结果表明这是个坏主意。我想这是因为这个方法不使用duck类型。在

有没有一种方法可以避免输入编码函数?在

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


Tags: 对象方法函数obj类型编码if序列化
3条回答

任何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.int16np.bool_str(如果它碰巧表示一个int或float)。现在看“这要看情况”。如果您希望所有这些东西都隐藏起来,或者如果您的程序将这些非浮点的东西定义为垃圾并且您希望出错,那么这是非常好的。在

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

^{pr2}$

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

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

或者

^{pr2}$

请注意,最好使用isinstance(obj, numpy.float64),或者isinstance(obj, (numpy.float32, numpy.float64))。Duck类型对于像iterables这样的东西是有意义的,你试图把它们当作iterables来对待,如果成功了,你就知道它们是iterable。在这里?你试着把你的对象当作一个numpy标量,如果它起作用,你知道。。。{{cd3}方法的对象。这不是你真正感兴趣的信息。在

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

特殊的类型大小写在这里是完全合理的-因为这听起来像是把它输入到一个无论如何都不适合duck类型的API中。在

但正如其他地方提到的,np.float is float,所以这行不通。您可能想要isinstance(val, np.floating),或者{}。在

为了将来的参考,如果您想知道整个类层次结构(不包括abcs)是什么,可以使用.__mro__属性获得它:

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

相关问题 更多 >