V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
AkideLiu
V2EX  ›  Python

移植 Python 项目到 typescript,如何处理 Python attrs 库呢

  •  
  •   AkideLiu · Dec 5, 2021 · 2788 views
    This topic created in 1608 days ago, the information mentioned may be changed or developed.

    各位彦祖好,最近在把一个 python 写的项目改写成 typescript

    发现原始 python 代码里面使用了大量的 attr.ib(),在 attr.ib()里面有很多的参数比如 cmp ,factory ,converter ,validator 等等。

    初步想法是用 ts class 的 constructor 来实现类似的功能,但是这样的话上面提到的细节参数都需要有单独的验证和处理,请问有什么适用于 typescript 类似于 attr 的库方便实现这样的功能吗?

    attrs 的官方文档 : https://www.attrs.org/en/stable/

    看完官方文档和例子感觉有点像 java 的 lombok

    一段例子如下:

    https://github.com/cs50/compare50/blob/main/compare50/_data.py#L114-L149

    @attr.s(slots=True, frozen=True)
    class Submission:
        """
        :ivar path: the file path of the submission
        :ivar files: list of :class:`compare50.File` objects contained in the submission
        :ivar preprocessor: A function from tokens to tokens that will be run on \
                each file in the submission
        :ivar id: integer that uniquely identifies this submission \
                (submissions with the same path will always have the same id).
        Represents a single submission. Submissions may either be single files or
        directories containing many files.
        """
        _store = IdStore(key=lambda sub: (sub.path, sub.files, sub.large_files, sub.undecodable_files))
    
        path = attr.ib(converter=pathlib.Path, cmp=False)
        files = attr.ib(cmp=False)
        large_files = attr.ib(factory=tuple, converter=_to_path_tuple, cmp=False, repr=False)
        undecodable_files = attr.ib(factory=tuple, converter=_to_path_tuple, cmp=False, repr=False)
        preprocessor = attr.ib(default=lambda tokens: tokens, cmp=False, repr=False)
        is_archive = attr.ib(default=False, cmp=False)
        id = attr.ib(init=False)
    
    
        def __attrs_post_init__(self):
            object.__setattr__(self, "files", tuple(
                [File(pathlib.Path(path), self) for path in self.files]))
            object.__setattr__(self, "id", Submission._store[self])
    
        def __iter__(self):
            return iter(self.files)
    
        @classmethod
        def get(cls, id):
            """Retrieve submission corresponding to specified id"""
            return cls._store.objects[id]
    
    3 replies    2021-12-05 17:09:07 +08:00
    Opportunity
        1
    Opportunity  
       Dec 5, 2021
    gouflv
        2
    gouflv  
       Dec 5, 2021 via iPhone
    class-transformer + class-validator
    pengtdyd
        3
    pengtdyd  
       Dec 5, 2021
    改啥改,又不是不能用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2383 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 11:41 · PVG 19:41 · LAX 04:41 · JFK 07:41
    ♥ Do have faith in what you're doing.