我遇到一个问题,其中一行现有代码在python 2.7中工作,在使用python 3时引发异常。下面是一个简单的例子,请注意我已经减少了";规则";以仅显示相关值。
>>> Rules=[{u'source': u'SOURCE_TABLE', u'target': u'TARGET_TABLE', u'mappings': [{u'action': u'lookup', u'tColumn': u'TARGET_COLUMN', u'sColumn': u'SOURCE_COLUMN', u'entity_id': u'1'}, {u'action': u'lookup', u'tColumn': u'TARGET_COLUMN1', u'sColumn': u'SOURCE_COLUMN1', u'entity_id': u'2'}]}]
>>> for rule in Rules:
... m=filter(lambda mapping: mapping.get('action') in ['lookup'],rule['mappings'])
...
>>> m
[{u'action': u'lookup', u'entity_id': u'1', u'tColumn': u'TARGET_COLUMN', u'sColumn': u'SOURCE_COLUMN'}, {u'action': u'lookup', u'entity_id': u'2', u'tColumn': u'TARGET_COLUMN1', u'sColumn': u'SOURCE_COLUMN1'}]
在使用Python 3.7运行时,相同的代码引发了一个异常-
TypeError: Invalid argument, not a string or column: <function <lambda> at 0x7efdfbe708b0> of type <class 'function'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.
我试着根据python 3文档将filter函数包装在列表中(filter(….((,但没有帮助。
我在Databricks中遇到了这个问题,@Barmar的评论是一个正确的提示。
不使用filter()
,而是使用生成器函数:
m = [mapping for mapping in rule['mappings'] if mapping.get('action') in ['lookup']]