gpt4 book ai didi

python - 如何正确合并鸭子类型(duck typing)以返回原始类型?

转载 作者:太空狗 更新时间:2023-10-29 20:54:34 24 4
gpt4 key购买 nike

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

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

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

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

def feetToMeters(val):
try:
return val * 0.3084
except TypeError:
return [0.3084 * v for v in val]

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

这是在此处合并鸭子类型(duck typing)的最佳方式,以便我可以避免使用 type 函数吗?本来我试过AttributeError,但是没有用。尽管如此,我还是对 TypeError 感到厌烦,尽管它似乎有效。

使用 if type(val) is list 代替会不会亵渎神明?

最佳答案

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

是的,因为它不适用于列表的子类。如果你想这样做,至少要执行 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 数组列表。

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

关于python - 如何正确合并鸭子类型(duck typing)以返回原始类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11421901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com