【问题标题】:How to avoid lambda in Python如何在 Python 中避免 lambda
【发布时间】:2017-01-05 11:37:37
【问题描述】:
def parameterSchaetzung(kontextfreq,a,p,f1):
    parameter = defaultdict(lambda: defaultdict(int))
    for (s,w) in kontextfreq:
        parameter[s][w] = (kontextfreq[(s,w)] + a[s] * p[w]) / (f1[s] + a[s])
        #print((kontextfreq[(s,w)] + a[s] * p[w]) / (f1[s] + a[s]))
    return parameter

当我尝试在 pickle 中写入函数的结果时出现错误。我认为,问题在于 lambda。我该如何解决?

>>> parameter = defaultdict(lambda: defaultdict(int))
>>> pickle.dump(parameter,open("foo","wb"))
Traceback (most recent call last):
  File "<string>", line 301, in runcode
  File "<interactive input>", line 1, in <module>
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000000032DA620>: attribute lookup <lambda> on __main__ failed

【问题讨论】:

  • 什么错误...
  • 在发布 Python 代码时,您需要准确地复制缩进。否则,您将在要求人们阅读的代码中引入新问题。
  • 另外请提供足够的代码,以便我们自己试用您的代码 (MCVE)。在这种情况下,可能是方法的示例调用和 pickle 调用?
  • @wonderb0lt:我已经编辑了最后一点,很容易重现,不需要上面的功能。

标签: python lambda pickle


【解决方案1】:

您的程序中已知的lambda 特征,您不能腌制函数。

你真正想要的是腌制数据,所以转储时只需转换为dict

pickle.dump(dict(parameter),f)

并在加载时转换回来

parameter = defaultdict(lambda: defaultdict(int))
parameter.update(pickle.load(f))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多