我正在尝试寻找一种方法来创建一个具有可变字段的命名元组,具体取决于您收到的数据,在我的情况下,我正在使用StatCounter中的数据并非所有期间都使用相同的浏览器。我尝试过这种方式,但是它有点难看,而且我敢肯定有一种更好的方法可以实现它。
def namedtuple_fixed(name: str, fields: List[str]) -> namedtuple:
"""Checks the fields of the namedtuple and changes the invalid ones."""
def starts_with_number(string: str) -> bool:
if string[0].isdigit():
return True
return False
fields_fixed: List[str] = [
field.replace(" ", "_")
if not starts_with_number(field)
else f"c{field.replace(' ', '_')}"
for field in fields
]
return namedtuple(name, fields_fixed)
Records: namedtuple = None
def read_file(file: str) -> List["Records"]:
"""
Read the file with info about the percentage of use of various browsers
"""
global Records
with open(file, encoding="UTF-8") as browsers_file:
reader: Iterator[List[str]] = csv.reader(browsers_file)
field_names: List[str] = next(reader)
Records = namedtuple_fixed("Record", field_names)
result: List[Records] = [
Records(
*[
dt.datetime.strptime(n, "%Y-%m").date()
if record.index(n) == 0
else float(n)
for n in record
]
)
for record in reader
]
return result
“ namedtuple_fixed”功能用于修复标识符无效的名称。
基本上,我想创建一个命名元组,以接收可变数量的参数,具体取决于您要分析的文件。而且,如果结合了类型检查功能(我的意思是使用来自键入模块的 NamedTuple ),那就更好了。 预先感谢。
答案 0 :(得分:0)
这解决了我的问题,但是诸如pylint或mypy之类的linters无法识别 dict 方法,如果我尝试获取元素,它会警告我它没有该属性,即使它确实有它
class Record:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __repr__(self):
keys = sorted(self.__dict__)
items = [f"{k}={self.__dict__[k]!r}" for k in keys]
return f"Record({', '.join(items)})"
def __eq__(self, other):
return self.__dict__ == other.__dict__
这是来自types.SimpleSpace文档的重构代码