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 · 240 天前 · 3201 次点击
    这是一个创建于 240 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    楼上说的很全面了,最好还是直接看源码,没有源码的话只能看文档。
    lonewolfakela
        8
    lonewolfakela  
       240 天前
    实在不好弄直接开调试器看……
    flyqie
        9
    flyqie  
       240 天前 via Android
    @lonewolfakela #8

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

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

    Python 的话基本上都喜欢一个 dict 走天下,dict 里有什么全靠文档,什么类型不存在的。
    现在我写代码别人的变量都加上 Typehint ,没有代码提示写代码都提心吊胆。不过也不是所有地方都有确定的数据结构……
    lhbc
        14
    lhbc  
       239 天前 via Android   ❤️ 2
    @flyqie Python 是典型的强类型
    ochatokori
        15
    ochatokori  
       239 天前 via Android
    当然是控制台打印出来看
    bybyte
        16
    bybyte  
       239 天前
    写习惯了 c/c++/golang 写 python 相当难受。。。
    mPatrickStar
        17
    mPatrickStar  
       239 天前
    看文档、跳转看源码、debug 、依靠熟悉程度。
    wipbssl
        18
    wipbssl  
       239 天前
    @flyqie python 是强类型,动态类型。
    mmdsun
        19
    mmdsun  
       239 天前
    对接 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  
       239 天前
    @bybyte 反之亦然
    flyqie
        21
    flyqie  
       239 天前 via Android
    @wipbssl #18
    @lhbc #17

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

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

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

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

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

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

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

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

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

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