如何正确合并ducktyping以返回原始类型?

2024-10-01 00:23:12 发布

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

我真的希望这不是重复的。我试图寻找我的问题,但似乎找不到。在

所以我有一个相当简单的函数,可以将英尺转换为米:

def feetToMeters(val):
    return numpy.array(val) * 0.3048

这很好地工作,可以接受int、float、数组和列表。但是,如果我放入一个list(而不是numpy数组),我希望返回一个list。所以我写了这个:

^{pr2}$

(或者,如果我想在这里使用numpy,我可以在最后一行使用return list(numpy.array(val) * 0.3084),我不知道这是否重要。)

这是在这里合并duck类型以便避免使用type函数的最佳方法吗?最初我试过AttributeError,但没用。尽管如此,我还是对TypeError感到厌烦,尽管它似乎有用。在

if type(val) is list代替是亵渎吗?在


Tags: 函数numpy列表returndeftypeval数组
3条回答

既然你已经使用了numpy,我会避免在这里使用类似于

def feetToMeters(val):
    if numpy.isscalar(val):
        return val * 0.3084
    else:
        return numpy.array(val) * 0.3048

捕捉类型错误是危险的,因为它可能是由除列表之外的许多因素引起的。为此,我通常使用isinstance(val,list)。在

Would it be sacrilegious to use if type(val) is list instead?

是的,因为它不适用于list的子类。如果你想走这条路,至少要做isinstance(val, list)。这里有一个特别处理列表的解决方案,并将其他所有内容(包括标量和元组)转换为NumPy数组:

def feetToMeters(feet):
    meters = np.asarray(feet) * 0.3048
    return list(meters) if isinstance(feet, list) else meters

请注意:

  • 传递list子类的实例将导致返回一个普通的list
  • 传递列表列表将导致返回NumPy数组的列表。在

您可以扩展它来专门处理更多类型,但一般来说,对于要处理的每个类型,您需要编写更多的代码,因为您需要知道如何构造该类型。因此,这种类型转换通常留给客户端代码。在

相关问题 更多 >