gpt4 book ai didi

python - 鸭打字麻烦。 "i-am-like-a-list"的鸭子打字测试

转载 作者:太空狗 更新时间:2023-10-30 01:01:03 24 4
gpt4 key购买 nike

在末尾添加使用上下文

我经常想对像列表这样的抽象对象进行操作。例如

def list_ish(thing):
for i in xrange(0,len(thing)):
print thing[i]

现在如果 thing 是一个列表,这是合适的,但是如果 thing 是一个字典,它将失败。为什么要问“你的行为像列表吗?”的 pythonic 是什么?

注意:

hasattr('__getitem__') and not hasattr('keys')

这适用于我能想到的所有情况,但我不喜欢消极地定义鸭子类型,因为我预计可能会有它无法捕获的情况。

真正想问的是
“嘿,你是不是按照我期望列表的方式对整数索引进行操作?”例如

  thing[i],  thing[4:7] = [...],   etc.

注意:我不想简单地在大型 try/except 中执行我的操作,因为它们具有破坏性。在这里尝试失败并不酷....

使用环境-- “点列表”是一个类似列表的东西,它包含类似字典的东西作为它的元素。-- “矩阵”是一个包含类似列表的事物的类似列表的事物

-- 我有一个函数库,可以对点列表进行操作,也可以类似的方式对类似矩阵的东西进行操作。

——例如,从用户的角度来看,像“类似电子表格”的操作“列切片”这样的破坏性操作可以以类似的方式对矩阵对象和点列表对象进行操作——结果东西和原来的一样,但只有指定的列。

-- 因为这个特定的操作是破坏性的,所以把一个对象当作一个矩阵来处理并不酷,只是在操作的过程中发现它实际上是一个点列表或者什么都不是-以上。

-- 我希望我的“is_matrix”和“is_point_list”测试具有高性能,因为它们有时发生在内部循环中。因此,我会对仅调查元素零的测试感到满意。

-- 我更喜欢不涉及构建临时对象的测试,只是为了确定对象的类型,但也许这不是 python 方式。

总的来说,我发现整个鸭子打字的事情有点困惑,充满了错误和缓慢,但也许我还没有像一个真正的 Pythonista 那样思考

很高兴喝更多的kool-aid...

最佳答案

你可以做的一件事是从前面获取一个零长度的切片:/p>

try:
thing[:0]
except TypeError:
# probably not list-like
else:
# probably list-like

切片在 dict 上失败,因为切片不可哈希。

但是,strunicode 也通过了这个测试,并且您提到您正在进行破坏性编辑。这意味着您可能还想检查 __delitem____setitem__:

def supports_slices_and_editing(thing):
if hasattr(thing, '__setitem__') and hasattr(thing, '__delitem__'):
try:
thing[:0]
return True
except TypeError:
pass
return False

我建议您组织您对输入的要求,以及您希望函数处理的可能输入的范围,比您目前在问题中所做的更明确。如果您真的只想处理 listdict,您应该使用 isinstance,对吧?也许您的方法所做的只能删除项目,或者只能替换项目,因此您无需检查其他功能。记录这些要求以备将来引用。

关于python - 鸭打字麻烦。 "i-am-like-a-list"的鸭子打字测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338121/

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