创建对differents参数有效的namedtuple

时间:2019-06-18 19:08:56

标签: python python-3.7 namedtuple

我正在尝试寻找一种方法来创建一个具有可变字段的命名元组,具体取决于您收到的数据,在我的情况下,我正在使用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 ),那就更好了。 预先感谢。

1 个答案:

答案 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文档的重构代码