创建对不同参数有效的namedtuple

2024-05-15 22:46:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一种方法来创建一个带有变量字段的namedtuple,具体取决于您收到的数据,在我的例子中,我使用的是来自StatCounter的数据,而不是所有的句点都是相同的浏览器。我试过这种方法,但它有点丑陋,我相信有一个更好的方法来实现它

def namedtuple_fixed(name: str, fields: List[str]) -> namedtuple:
    """Check the fields of the namedtuple and changes the invalid ones."""

    fields_fixed: List[str] = []

    for field in fields:
        field = field.replace(" ", "_")

        if field[0].isdigit():
            field = f"n{field}"

        fields_fixed.append(field)

    return namedtuple(name, fields_fixed)


Records: namedtuple = namedtuple("empty_namedtuple", "")


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\u fixed”函数用于修复具有无效标识符的名称

基本上,我想创建一个命名元组,根据您要分析的文件,它接收一个可变数量的参数。如果它结合了类型检查(我的意思是使用来自类型模块的NamedTuple),那就更好了。 提前谢谢


Tags: ofthe方法infieldfieldsfornamedtuple
1条回答
网友
1楼 · 发布于 2024-05-15 22:46:11

这解决了我的问题,但只是部分


class Record(SimpleNamespace):
    def __repr__(self):
        items = [f"{key}={value!r}" for key, value in self.__dict__.items()]
        return f"Record({', '.join(items)})"

使用types.SimpleSpace文档

它可能会导致问题,例如,如果您初始化如下所示的记录:

foo = Record(**{"a": 1, "3a": 2})
print(foo.a) # Ok
print(foo.3a) # Syntax Error

相关问题 更多 >