将参数传递给defaultdict创建的对象

4

我希望有一个默认字典,在构造新对象时包含一个参数。这是否可能?是否有更好的方法?

defaultdict(myobj, param1)

然后是myobj:

class myobj(object):

    def __init__(self, param1):
        self.param1 = param1
1个回答

7

defaultdict可以接受任何可调用对象,因此您可以创建一个新函数,该函数不需要参数并返回使用您想要的参数实例化的对象。

d = defaultdict(lambda: myobj(param1))

另一个选项是使用functools.partial,它创建了一个带有一个或多个参数预定义的函数:
import functools
d = defaultdict(functools.partial(myobj, param1))

对JonClements的观点表示赞同。关注作用域最简单的方法是使用def显式创建函数/闭包,然后将该函数传递给defaultdict。这样你就有了可以正确调试和检查的东西。 - abarnert
我不知道Lambda没有闭包。有人知道是否functools.partial会更好吗? - Chris Barker
lambdadef具有完全相同的作用域规则。如果您在循环中执行此操作,functools.partial是避免头痛的好方法。 - user2357112
Lambda函数确实具有闭包(事实上,“lambda”并不存在;它所创建的只是一个函数,就像“def”所创建的一样)。只是如果你在表达式中间创建一个未命名的对象,那么调试或检查就会更加困难。 - abarnert
我已经尝试了两种方法,但不幸的是,它们都无法被shelve序列化(pickleable)。 - Kevin
def 应该是可 pickle 的。 def myobj_withparam(): return myobj(param1); d = defaultdict(myobj_withparam) - Chris Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接