typeric: Python 中的实用类,如 Result 和 Option 等 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
stebest
V2EX    分享创造

typeric: Python 中的实用类,如 Result 和 Option 等

  •  
  •   stebest
    newdee 139 天前 2448 次点击
    这是一个创建于 139 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址

    https://github.com/newdee/typeric

    类别

    Python

    项目标题

    Python 实用类,如 rust 风格的 Result 和 Option 等

    项目描述

    typeric 是一个面向 Python 的实用类型工具包,专注于清晰性、安全性和易用性。它最初是为了提升我个人的开发体验而构建的,但我也希望它能对他人有所帮助。

    目前,typeric 提供了轻量且支持模式匹配的类型,比如 Result 和 Option 设计灵感来自 Rust 。未来还计划引入更多常见的类型模式和错误处理抽象。

    亮点

    • 函数式风格的 Result 类型:Ok(value)Err(error)
    • 轻量级 Option 类型:Some(value)NONE
    • 支持模式匹配(通过 __match_args__
    • 不可变设计,提供 .map() / .map_err() / .unwrap() / .unwrap_or() 等辅助方法
    • 简洁的类型签名:Result[T, E]Option[T]
    • 易于扩展 更多类型工具即将推出

    示例代码

    ### `Result` from typeric.result import Result, Ok, Err def parse_number(text: str) -> Result[int, str]: try: return Ok(int(text)) except ValueError: return Err("Not a number") match parse_number("42"): case Ok(value): print("Parsed:", value) case Err(error): print("Failed:", error) ### `Option` from typeric.option import Option, Some, NONE def maybe_get(index: int, items: list[str]) -> Option[str]: if 0 <= index < len(items): return Some(items[index]) return NONE match maybe_get(1, ["a", "b", "c"]): case Some(value): print("Got:", value) case NONE: print("Nothing found") 
    15 条回复    2025-05-27 14:01:54 +08:00
    voyagerth1
        1
    voyagerth1  
       139 天前
    已经有一个类似的库了吧,叫 result
    stebest
        2
    stebest  
    OP
       139 天前
    @voyagerth1 那个貌似只有 result 吧,而且代码很老了,已经停止维护了
    ispinfx
        3
    ispinfx  
       139 天前
    屎上雕花~我说 Python ,不是说你的项目
    stebest
        4
    stebest  
    OP
       139 天前
    @ispinfx python2 的时代确实是噩梦,现在好歹有了 type hint ,也有了 match 语法,也确实增加了一些可读性,知道这坨谁拉的,为什么拉,拉的咋样起码是好事,毕竟生态强大有时候确实离不开。说到屎上雕花,我觉得像这种 https://github.com/The-Pocket/PocketFlow 为了精简而精简,一百行代码 ruff 报了三百行 warning ,一瞬间仿佛回到了 python2 的年代,可读性和安全性极差,可能更像你说的 hh 。
    3085570450tt
        5
    3085570450tt  
       138 天前
    @stebest #2 前阵子在 pyton 潮流周刊看的一个叫 safe-result 的 https://github.com/overflowy/safe-result
    arielherself
        6
    arielherself  
       138 天前
    和这个有什么区别: https://pypi.org/project/option
    arielherself
        7
    arielherself  
       138 天前
    这个是在 ddg 上搜索 “result and option for python” 出来的第一个结果
    stebest
        8
    stebest  
    OP
       138 天前
    @arielherself 你说的这个都没人维护了呀,最后一次三年前了,到现在 pyright 都不会让它过了。另外我这个只是自己觉得有用的就加进去,只是现在只加了这俩。
    stebest
        9
    stebest  
    OP
       138 天前
    @3085570450tt 这个感觉跟前面那个 Result 挺像的,也是刚写不久,不过 result 我倒是也有加,看来 rust 的枚举确实还是有人受用,不过 Result 坚持了那么久最后还是放弃了,我也只能说写点觉得实用的工具类放进去,后面遇到了也会放进去,说不定哪天官方版本自己有这些类似实现,或者更新不需要这些了,自然我这个也该废弃了。主打利己,如果对其他人有用那也更好。
    yb2313
        10
    yb2313  
       138 天前
    我嘞个 rustPython 啊, 这种库也不好随便用, 蔓延性太广了, 一用到处就是了, 而且没有?来很不方便, 等火了我再用
    stebest
        11
    stebest  
    OP
       138 天前
    @yb2313 哈哈,就觉得他们的错误处理比较好,go 的返回方式也行,后面看看要不要也整一个。
    yb2313
        12
    yb2313  
       138 天前
    @stebest #11 没有生态配合的话感觉还是不行, ai 补全也不会用这个形式来补全, 用起来就很麻烦了, 如果一定要这样写也仅限于严肃的项目, 那又还不如直接写 rust 了.
    stebest
        13
    stebest  
    OP
       138 天前
    @yb2313 还好,只是可以直接通过返回值来捕获错误也方便不少,毕竟做不到 rust 那么完善,但有些风格可以借鉴一下,先试着把哈哈,跟上面说的,到头来屎上雕花也可能。
    stebest
        14
    stebest  
    OP
       137 天前
    @yb2313 说到 rust 中的?,由于 python 中没有办法重载,加了一个 spread 来实现类似的功能了哈哈
    JeremyFeng
        15
    JeremyFeng  
       137 天前   1
    支持一下!最近也在学 Rust ,看到这种语法有点亲切哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2657 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 13:58 PVG 21:58 LAX 06:58 JFK 09:58
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86