kfs*_*one 1 python python-3.x python-3.4
我经常发现,当使用Pythonic套装时,Pythonic方式似乎不存在.
例如,做像dijkstra或*这样的事情:
openSet, closedSet = set(nodes), set(nodes)
while openSet:
walkSet, openSet = openSet, set()
for node in walkSet:
for dest in node.destinations():
if dest.weight() < constraint:
if dest not in closedSet:
closedSet.add(dest)
openSet.add(dest)
Run Code Online (Sandbox Code Playgroud)
这是一个虚弱的人为例子,重点是最后三行:
if not value in someSet:
someSet.add(value)
doAdditionalThings()
Run Code Online (Sandbox Code Playgroud)
鉴于Python的使用方式,例如,访问/使用dict的值,我本来希望能够做到:
try:
someSet.add(value)
except KeyError:
continue # well, that's ok then.
doAdditionalThings()
Run Code Online (Sandbox Code Playgroud)
作为一名C++程序员,我的皮肤爬行了一点,我甚至做不到:
if someSet.add(value):
# add wasn't blocked by the value already being present
doAdditionalThings()
Run Code Online (Sandbox Code Playgroud)
是否有更多Pythonic(如果可能更有效)的方式来使用这种类似防御的用法?
添加操作也不应该告诉您项目是否已经在集合中; 它只是确保它添加后它在那里.换句话说,你想要的不是"添加一个项目并检查它是否有效"; 你想首先检查项目是否在那里,如果没有,那么做一些特殊的东西.如果您只想添加项目,则根本不会进行检查.关于这种模式,没有什么是单一的:
if item not in someSet:
someSet.add(item)
doStuff()
else:
doOtherStuff()
Run Code Online (Sandbox Code Playgroud)
确实,API可以设计成.add返回项目是否已经存在,但根据我的经验,这不是一个特别常见的用例.集合的一部分是你可以自由添加项目而不必担心它们是否已经存在(因为添加已经包含的项目没有效果).此外,.add返回None与Python内置类型的一般约定一致,即改变其参数的方法返回None.它确实是这样的事情dict.setdefault(它获得了一个项目,但如果不存在则首先添加它),这是不寻常的情况.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |