基本上,我想知道我是否应该尽可能避免功能中的副作用,或者在某些情况下是否可以接受副作用。我想有一个pop
的函数并从字典中返回一个键,如果该函数只返回键,我很好奇:
def popkey(d):
k, v = d.popitem()
return k
mykey = popkey(d)
或者它是否还应该返回修改后的字典:
def popkey(d):
k, v = d.popitem()
return k, d
mykey, d = popkey(d)
更具体地说,我有以下内容,我需要继续浏览字典,所以我希望pop
键与列表中的元素配对。
def pop_nearest(d, pt):
"""Pops the key in `d` which is nearest to pt."""
to_pop = min(d.iterkeys(), key=lambda a: abs(a - pt))
d.pop(to_pop)
pts = [1,3,5,7,9]
for pt in pts:
nearest_pt = pop_nearest(d, pt)
# do some other stuff
答案 0 :(得分:1)
无需返回参数,因为您已在呼叫站点处对其进行了引用。
如果您选择在pop_nearest
子类中实现dict
作为方法,那么有时候(取决于您要实现的目标)返回self
是一个好主意,所以你可以连锁电话。
class MyDict(dict):
...
def pop_nearest(self, pt):
...
return self
...
x = mydict.pop_nearest(1).pop_nearest(2)
答案 1 :(得分:1)
您不需要返回修改后的字典。它在函数中进行了修改,就像你想象的那样,因为它是一个指向实际对象的引用/指针,而不是深层副本,并且在调用pop之后将在调用函数中以修改后的形式存在。返回密钥应该足够了,并按照你想要的方式工作。