问题
我正在为程序输入文件编写一个文件解析器,它可以在某种程度上解构为字典:也就是说,在输入文件中,有包含“键值对”的多级“字典”。
我有一个关键字字典,它告诉 read 函数要读取哪些键,以及如何解析键值。
例如,您可以在下面的代码摘录中看到,当读取 datum 时,应该使用函数 HelperFunctions.split_to_floats 解析该值:
'datum': HelperFunctions.split_to_floats
目标
我想做的是能够传递参数,这样我就不必为每种可能的类型(即值定界符)进行函数排列。
例如,将 keywords 字典重组为:
keywords = {
'_root': str,
'units': HelperFunctions._split(LINE,to=str,delim=','),
'datum': HelperFunctions._split(LINE,to=float,delim=' ')
}
代码示例
下面复制了我目前拥有的完整、可行的演示:
class HelperFunctions:
def comma_split_to_strings(string:str) -> list:
# Returns a list of strings
return string.split(',')
def split_to_floats(string:str) -> list:
# Returns a 1D list of floats
return list(map(float,string.split()))
keywords = {
'_root': str,
'units': HelperFunctions.comma_split_to_strings,
'datum': HelperFunctions.split_to_floats
}
card = {}
key = 'units'
value = 'Pa,kg,km'
if key in keywords:
cast = keywords[key]
card[key] = cast(value)
请您参考如下方法:
您要找的是partial在功能工具中。它允许您创建一个函数,其中一些参数绑定(bind)到值,以便您稍后可以使用缺失值调用返回的函数。
from functools import partial
# Bind the parameters you want to "freeze"
keywords = {
'_root': str,
'units': partial(HelperFunctions._split, to=str, delim=','),
'datum': partial(HelperFunctions._split, to=float, delim=' ')
}
# The later you just need to provide LINE
keywords['units'](LINE)
