带有空格或特殊字符的 Python 类型定义



我有一个python 3.8例程,旨在将键入添加到带有标头的CSV文件中,如下所示:

class Record(NamedTuple):
""" Define the fields and their types in a record. """
Category : str
Item : str
Serving Size :  str
Calories : int
SaturatedFat(%pctDaily) : int
Sugars : int
Protein : int
@classmethod
def _transform(cls: 'Record', dct: dict) -> dict:
""" Convert string values in given dictionary to corresponding Record
field type.
"""
return {field: cls._field_types[field](value)
for field, value in dct.items()}

我发现任何包含空格或特殊字符的标题字段都会出错,例如,

Saturated(%Fat) : float
^
SyntaxError: invalid syntax

有什么想法可以解决这个问题吗? TIA, 亚历克斯

您正在尝试使用非法字段名称创建NamedTuple。引用NamedTuple文档:

任何有效的 Python 标识符都可用于字段名称,但 以下划线开头的名称。有效标识符包括 字母、数字和下划线,但不以数字或开头 下划线,不能是关键字,例如类、for、返回、全局、 通过或提高。

你需要NamedTuple的所有装饰吗?据我所知,拥有一个类似自定义字典的词典将非常适合您:

class Record:
def __init__(self, record):
self._fields = {}
for k, t in {
"Category": str,
"Saturated(%Fat)": float
}.items():
self._fields[k] = t(record[k])
def __getitem__(self, key):
return self._fields[key]

请注意构造函数如何知道哪些字段必须存在。像这样使用它:

record = Record({"Category": "foo", "Saturated(%Fat)": "5.5"})
record["Saturated(%Fat)"] # 5.5

这是一个准系统解决方案,您可能需要添加其他方法,例如__len__()items().查看模拟容器类型以获取选项。

最新更新