V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
stebest
V2EX  ›  分享创造

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

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

    项目地址

    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  
       102 天前
    已经有一个类似的库了吧,叫 result
    stebest
        2
    stebest  
    OP
       102 天前
    @voyagerth1 那个貌似只有 result 吧,而且代码很老了,已经停止维护了
    ispinfx
        3
    ispinfx  
       102 天前
    屎上雕花~我说 Python ,不是说你的项目🤣
    stebest
        4
    stebest  
    OP
       102 天前
    @ispinfx python2 的时代确实是噩梦,现在好歹有了 type hint ,也有了 match 语法,也确实增加了一些可读性,知道这坨谁拉的,为什么拉,拉的咋样起码是好事,毕竟生态强大有时候确实离不开。说到屎上雕花,我觉得像这种 https://github.com/The-Pocket/PocketFlow 为了精简而精简,一百行代码 ruff 报了三百行 warning ,一瞬间仿佛回到了 python2 的年代,可读性和安全性极差,可能更像你说的 hh 。
    3085570450tt
        5
    3085570450tt  
       101 天前
    @stebest #2 前阵子在 python 潮流周刊看的一个叫 safe-result 的 https://github.com/overflowy/safe-result
    arielherself
        6
    arielherself  
       101 天前
    和这个有什么区别: https://pypi.org/project/option
    arielherself
        7
    arielherself  
       101 天前
    这个是在 ddg 上搜索 “result and option for python” 出来的第一个结果
    stebest
        8
    stebest  
    OP
       101 天前
    @arielherself 你说的这个都没人维护了呀,最后一次三年前了,到现在 pyright 都不会让它过了。另外我这个只是自己觉得有用的就加进去,只是现在只加了这俩。
    stebest
        9
    stebest  
    OP
       101 天前
    @3085570450tt 这个感觉跟前面那个 Result 挺像的,也是刚写不久,不过 result 我倒是也有加,看来 rust 的枚举确实还是有人受用,不过 Result 坚持了那么久最后还是放弃了,我也只能说写点觉得实用的工具类放进去,后面遇到了也会放进去,说不定哪天官方版本自己有这些类似实现,或者更新不需要这些了,自然我这个也该废弃了。主打利己,如果对其他人有用那也更好。
    yb2313
        10
    yb2313  
       101 天前
    我嘞个 rustPython 啊, 这种库也不好随便用, 蔓延性太广了, 一用到处就是了, 而且没有?来很不方便, 等火了我再用
    stebest
        11
    stebest  
    OP
       101 天前
    @yb2313 哈哈,就觉得他们的错误处理比较好,go 的返回方式也行,后面看看要不要也整一个。
    yb2313
        12
    yb2313  
       101 天前
    @stebest #11 没有生态配合的话感觉还是不行, ai 补全也不会用这个形式来补全, 用起来就很麻烦了, 如果一定要这样写也仅限于严肃的项目, 那又还不如直接写 rust 了.
    stebest
        13
    stebest  
    OP
       101 天前
    @yb2313 还好,只是可以直接通过返回值来捕获错误也方便不少,毕竟做不到 rust 那么完善,但有些风格可以借鉴一下,先试着把哈哈,跟上面说的,到头来屎上雕花也可能。
    stebest
        14
    stebest  
    OP
       100 天前
    @yb2313 说到 rust 中的?,由于 python 中没有办法重载,加了一个 spread 来实现类似的功能了哈哈
    JeremyFeng
        15
    JeremyFeng  
       100 天前   ❤️ 1
    支持一下!最近也在学 Rust ,看到这种语法有点亲切哈哈
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:06 · PVG 22:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.