python – 鸭子打字麻烦. “i-am-like-a-list”的鸭子打字测试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 鸭子打字麻烦. “i-am-like-a-list”的鸭子打字测试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2099字,纯文字阅读大概需要3分钟。
内容图文
![python – 鸭子打字麻烦. “i-am-like-a-list”的鸭子打字测试](/upload/InfoBanner/zyjiaocheng/809/41c961334b274524a2e68e43e6fdde56.jpg)
最后添加的使用上下文
我经常想要操作像列表这样的抽象对象.例如
def list_ish(thing):
for i in xrange(0,len(thing)):
print thing[i]
现在这个适当的东西是一个列表,但是如果东西是一个dict就会失败.什么是pythonic为什么要问“你表现得像一个列表?”
注意:
hasattr('__getitem__') and not hasattr('keys')
这将适用于我能想到的所有情况,但我不喜欢负面定义鸭子类型,因为我预计可能存在它无法捕获的情况.
我真正想要的是问.
“嘿,你按照我希望列表的方式对整数指标进行操作吗?”例如
thing[i], thing[4:7] = [...], etc.
注意:我不想简单地在大型try / except中执行我的操作,因为它们具有破坏性.尝试失败并不是很酷….
使用背景
– “点列表”是一个类似列表的东西,它包含类似字母的东西作为其元素.
– “矩阵”是类似列表的东西,包含类似列表的东西
– 我有一个函数库,可以在点列表上运行,也可以在类似矩阵的事物上运行.
– 例如,从用户的角度来看,像“电子表格式”操作“列切片”这样的破坏性操作可以同时对矩阵对象和点列表对象进行操作 – 结果就像原始的,但只有指定的列.
– 因为这个特定的操作是破坏性的,所以进行就好像一个对象是一个矩阵,只是为了通过操作找到部分方式,它实际上是一个点列表或者不是上面的.
– 我希望我的’is_matrix’和’is_point_list’测试具有高效性,因为它们有时会出现在内部循环中.因此,我会对仅测试元素零的测试感到满意.
– 我更喜欢不涉及构造临时对象的测试,只是为了确定对象的类型,但也许这不是python方式.
总的来说,我发现整个鸭子打字的东西有点混乱,充满了虫子和缓慢,但也许我还没想到真正的Pythonista
很高兴喝更多的kool-aid …
解决方法:
你可以做的一件事,就是应该在正常的列表上快速工作而在正常的dict上失败,从前面采取零长度切片:
try:
thing[:0]
except TypeError:
# probably not list-like
else:
# probably list-like
切片在dicts上失败,因为切片不可清除.
但是,str和unicode也通过了这个测试,你提到你正在进行破坏性编辑.这意味着您可能还想检查__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
我建议你组织你的输入要求,以及你希望你的功能处理的可能输入的范围,比你在问题中到目前为止更明确.如果你真的只想处理列表和dicts,你会使用isinstance,对吧?也许您的方法所做的只能删除项目,或者只替换项目,因此您无需检查其他功能.记录这些要求以供将来参考.
内容总结
以上是互联网集市为您收集整理的python – 鸭子打字麻烦. “i-am-like-a-list”的鸭子打字测试全部内容,希望文章能够帮你解决python – 鸭子打字麻烦. “i-am-like-a-list”的鸭子打字测试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。