是否有一种可接受的方法让函数从参数中弹出一个值?

时间:2016-08-12 15:37:25

标签: python dictionary side-effects

基本上,我想知道我是否应该尽可能避免功能中的副作用,或者在某些情况下是否可以接受副作用。我想有一个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

2 个答案:

答案 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之后将在调用函数中以修改后的形式存在。返回密钥应该足够了,并按照你想要的方式工作。