V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
voidmnwzp
V2EX  ›  Python

动态类型的语言用第三方的库,到底如何确定返回值类型?

  •  1
     
  •   voidmnwzp ·
    NullpointerW · 2023-09-01 00:17:59 +08:00 · 3458 次点击
    这是一个创建于 435 天前的主题,其中的信息可能已经有所发展或是发生改变。

    没怎么用过动态类型语言写项目,最近的项目要用到 openai 相关的 api 接口,直接就动手撸 py 了,但是每次调没有 type Hints 第三方轮子返回的数据又不知道如何用,点进源码也是乱七八糟的各种调用,也没有 ide 提示,这就很麻烦了

    32 条回复    2023-09-06 00:42:40 +08:00
    szzhiyang
        1
    szzhiyang  
       2023-09-01 00:23:21 +08:00
    无解,赶紧转 Go 语言。
    lanlanye
        2
    lanlanye  
       2023-09-01 00:23:57 +08:00
    如果你知道接口应该返回什么类型,可以在声明变量的时候自己加上注解,这样至少之后的代码能有提示。
    dayeye2006199
        3
    dayeye2006199  
       2023-09-01 00:28:02 +08:00 via Android
    Python 是这样的,只能看 API 文档了
    szzhiyang
        4
    szzhiyang  
       2023-09-01 00:33:23 +08:00
    咦,你不是主用 Go 吗?为啥用 Python ?
    voidmnwzp
        5
    voidmnwzp  
    OP
       2023-09-01 00:38:35 +08:00
    openai 官方有 py 的库,调用起来比较方便,go 的话还要写轮子
    Sinksky
        6
    Sinksky  
       2023-09-01 00:39:08 +08:00
    Typehint 、翻文档、看别人怎么用的、全局搜索找定义。。
    flyqie
        7
    flyqie  
       2023-09-01 00:55:13 +08:00 via Android
    弱类型都这样,你说的这些如果实现了,那还叫啥弱类型。。

    楼上说的很全面了,最好还是直接看源码,没有源码的话只能看文档。
    lonewolfakela
        8
    lonewolfakela  
       2023-09-01 00:57:23 +08:00
    实在不好弄直接开调试器看……
    flyqie
        9
    flyqie  
       2023-09-01 01:08:27 +08:00 via Android
    @lonewolfakela #8

    弱类型经典且好用的调试方法:

    开调试器/打印出来类型看看
    dayeye2006199
        10
    dayeye2006199  
       2023-09-01 02:34:53 +08:00
    不怕麻烦的话,可以给原库加上 typeddict -- https://peps.python.org/pep-0589/
    lsry
        11
    lsry  
       2023-09-01 04:05:38 +08:00   ❤️ 1
    深有同感吗,不只是返回值,如果使用某个函数带参数,甚至都不知道怎么传参
    mahaoqu
        12
    mahaoqu  
       2023-09-01 06:31:42 +08:00
    动态类型语言当然是开发的时候就用 REPL 啦,要不然 IPython 弄的那么精致是为了什么
    oldshensheep
        13
    oldshensheep  
       2023-09-01 06:50:09 +08:00
    Python 现在也支持声明类型,不过现在用的库比较少。
    说实话我特别讨厌写 Python 调用别人的库,基本上总是要看源码,看文档,看文档一般是打开网页看。
    写 Python 基本上一直在 debug ,然后摸石头过河……

    Python 的话基本上都喜欢一个 dict 走天下,dict 里有什么全靠文档,什么类型不存在的。
    现在我写代码别人的变量都加上 Typehint ,没有代码提示写代码都提心吊胆。不过也不是所有地方都有确定的数据结构……
    lhbc
        14
    lhbc  
       2023-09-01 07:13:03 +08:00 via Android   ❤️ 2
    @flyqie Python 是典型的强类型
    ochatokori
        15
    ochatokori  
       2023-09-01 09:01:55 +08:00 via Android
    当然是控制台打印出来看
    bybyte
        16
    bybyte  
       2023-09-01 09:06:09 +08:00
    写习惯了 c/c++/golang 写 python 相当难受。。。
    mPatrickStar
        17
    mPatrickStar  
       2023-09-01 09:12:47 +08:00
    看文档、跳转看源码、debug 、依靠熟悉程度。
    wipbssl
        18
    wipbssl  
       2023-09-01 09:33:34 +08:00
    @flyqie python 是强类型,动态类型。
    mmdsun
        19
    mmdsun  
       2023-09-01 09:55:14 +08:00
    对接 OpenAI 我看了一圈选择的 Java ,spring webflux 项目只需要一句话,还支持 SSE 。

    ```
    @PostMapping(value = "/completions-web-client", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> completionsWebClient(@RequestBody @Valid ChatRequest request) {
    ParameterizedTypeReference<ServerSentEvent<String>> type = new ParameterizedTypeReference<>() {
    };
    return webClient.post()
    .uri("/v1/chat/completions")
    .bodyValue(request)
    .header("Authorization", "Bearer " + chatGptConfig.getOpenAi().getApiKey())
    .retrieve()
    .bodyToFlux(type);
    }
    ```
    ruanimal
        20
    ruanimal  
       2023-09-01 10:15:33 +08:00
    @bybyte 反之亦然
    flyqie
        21
    flyqie  
       2023-09-01 10:27:16 +08:00 via Android
    @wipbssl #18
    @lhbc #17

    感谢指教,一直以为 python 是弱类型。。

    我补补相关知识去。。
    pkoukk
        22
    pkoukk  
       2023-09-01 10:29:00 +08:00
    看文档,动态类型语言就是这样
    Danswerme
        23
    Danswerme  
       2023-09-01 11:45:58 +08:00
    看文档,打断点或者打印日志
    lhbc
        24
    lhbc  
       2023-09-01 11:50:12 +08:00 via Android
    如果一个接口返回的数据,某些字段的类型不确定,动态类型语言不是更容易处理吗?
    Go 这种静态类型,想把数据 parse 进结构体要怎么写?
    NoOneNoBody
        25
    NoOneNoBody  
       2023-09-01 12:24:15 +08:00
    我靠 ide 扩展 pyright
    ZeroDu
        26
    ZeroDu  
       2023-09-01 12:28:38 +08:00
    确实调方法简直是噩梦,根本不知道方法可以传递那些参数。
    julyclyde
        27
    julyclyde  
       2023-09-03 13:27:36 +08:00
    @oldshensheep 那个声明好像也就仅仅是声明吧,给 IDE 用的。没有运行时意义
    zyxbcde
        28
    zyxbcde  
       2023-09-03 22:15:21 +08:00 via iPhone
    现在正八经写 python 的大部分都会写类型,最起码我自己在使用开源项目时候没有这种烦恼。一个项目想收获 star 自然得让人能看得懂,能用。如果他提供的代码和文档你都看不懂,那最好别直接用这项目。
    Gantnocap
        29
    Gantnocap  
       2023-09-04 06:58:05 +08:00
    我说些建议你参考一下吧

    1. 首先要多查看该库的官方文档,文档通常会注明函数和方法的输入参数类型和返回值类型。

    2. 如果文档不够明确,可以查看该函数或方法的源码实现,来推断返回值类型。

    3. 通过打印输出或判断类型(type())来判断返回结果的类型。

    4. 如果返回结果为字典、列表等复杂类型,可以逐层打印输出结果,来查看内部结构。

    5. 也可以写一些测试代码,传入不同的参数,来观察返回结果。

    6. 如果实在无法确定,可以将返回结果赋值给变量,然后通过变量的属性和方法来推断类型。

    7. 最后,如果需要可以给第三方库作者提 issue 或 PR,请求补充类型注释,来改进库的类型提示。

    综上,多查看文档、源码,辅以打印输出、测试等方法可以更好地判断 Python 第三方库中函数的返回类型。
    fbichijing
        30
    fbichijing  
       2023-09-04 17:05:39 +08:00
    有 api 的不是 api 有规定字段对应的格式吗?返回值一般的话同一个字段类型都是固定的吧。如果不同时候调用返回时的类型不一样也太神奇了吧..
    Maerd
        31
    Maerd  
       2023-09-05 09:36:48 +08:00
    api 没有规定格式?
    zjp
        32
    zjp  
       2023-09-06 00:42:40 +08:00 via Android
    偶尔需要写 bash 搞不定的脚本时会用 Python ,也一直被这个问题困扰。在控制台实时看数据类型能解决一部分,但是带来的新问题是要在源文件和控制台直接来回复制代码😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2085 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:14 · PVG 00:14 · LAX 08:14 · JFK 11:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.