使用 psycopg2 类型存根注释返回类型

2024-04-16

如果可以建立连接,我有一个返回 psycopg2 连接的函数。所以返回类型应该是Optional[psycopg2.connection], or psycopg2.connection | None。但是我无法导入psycopg2.connection在运行时。我已经尝试过中提到的解决方法如何从 typeshed 存根文件导入类型定义? https://stackoverflow.com/questions/66007912/how-can-i-import-type-definitions-from-a-typeshed-stub-file但这给了我这个 mypy 错误:Single overload definition, multiple required。这是我的代码

import psycopg2
from typing import Optional, TYPE_CHECKING, overload

if TYPE_CHECKING:
    from psycopg2 import connection
    
    @overload
    def get_connection() -> Optional[connection]: ...


# Make DB error logging less spammy
has_logged_error = False

def get_connection():
    try:
        conn = psycopg2.connect(
            dbname=settings.db_name,
            user=settings.db_user,
            password=settings.db_password,
            host=settings.db_host,
            port=settings.db_port,
        )
        return conn
    except Exception as e:
        global has_logged_error
        if not has_logged_error:
            logger.error(f"Error connecting to DB: {e}")
            has_logged_error = True
        return

您链接的问题提出了一些极其肮脏的黑客,但它似乎不再起作用。这么简单的情况下根本就没有必要。此外,说实话,我无法在任何mypy版本从0.800(足够老了,考虑到链接的答案是最近的),所以也许从来没有工作过。

为了便于阅读,我减少了您的代码示例,使其仅包含最小的返回值。

变体 1:使用条件导入和字符串注释

import psycopg2
from typing import Optional, TYPE_CHECKING

if TYPE_CHECKING:
    from psycopg2 import connection
    
def get_connection() -> Optional['connection']:
    return psycopg2.connect(...)

这很简单:mypy知道什么connection是(在存根中定义);运行时不会尝试学习一些东西connection因为它只看到一个字符串。

变体 2:使用条件导入和注释 future

from __future__ import annotations
import psycopg2
from typing import Optional, TYPE_CHECKING

if TYPE_CHECKING:
    from psycopg2 import connection
    
def get_connection() -> Optional[connection]:
    return psycopg2.connect(...)

未来进口的文件 https://docs.python.org/3/library/__future__.html。这与直接使用字符串非常相似,但看起来更好并且更方便,IMO。

变体 3:使用字符串注释,但避免条件导入

import psycopg2
from typing import Optional
    
def get_connection() -> Optional['psycopg2.connection']:
    return psycopg2.connect(...)

变体 4:使用 future 注释,但避免条件导入

from __future__ import annotations
import psycopg2
from typing import Optional
    
def get_connection() -> Optional[psycopg2.connection]:
    return psycopg2.connect(...)

变体 3 和 4 没有暴露这一点connection仅存根,将其隐藏为实现细节。您可能更愿意明确说明这一点 - 然后使用 1 或 2。

修改以使用当前功能

这是我最喜欢的。 Union 语法在 python 3.10+ 中有效,因此如果您使用较旧的语法 - 您可能需要坚持使用Optional如上所述,以保持一致性。然而,annotationsfuture-import 使这个表达式有效地成为一个字符串,因此如果您的工具不执行任何运行时类型自省 - 您仍然可以在旧版本上使用管道联合语法。请注意typing.get_type_hints在 3.10 之前的 python 上,类似的实用程序将因此语法而失败。

from __future__ import annotations
import psycopg2
    
def get_connection() -> psycopg2.connection | None:
    return psycopg2.connect(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 psycopg2 类型存根注释返回类型 的相关文章

  • 在PyGI中获取窗口句柄

    在我的程序中 我使用 PyGObject PyGI 和 GStreamer 在 GUI 中显示视频 该视频显示在Gtk DrawingArea因此我需要获取它的窗口句柄realize 信号处理程序 在 Linux 上 我使用以下方法获取该句
  • 从字典的元素创建 Pandas 数据框

    我正在尝试从字典创建一个 pandas 数据框 字典设置为 nvalues y1 1 2 3 4 y2 5 6 7 8 y3 a b c d 我希望数据框仅包含 y1 and y2 到目前为止我可以使用 df pd DataFrame fr
  • 定义Python源代码编码的正确方法

    PEP 263 http www python org dev peps pep 0263 定义如何声明Python源代码编码 通常 Python 文件的前两行应以以下内容开头 usr bin python coding
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • 数据框 - 平均列

    我在 pandas 中有以下数据框 Column 1 Column 2 Column3 Column 4 2 2 2 4 1 2 2 3 我正在创建一个数据框 其中包含第 1 列和第 2 列 第 3 列和第 4 列等的平均值 ColumnA
  • 如何使用 Python boto3 获取 redshift 中的列名称

    我想使用 python boto3 获取 redshift 中的列名称 创建Redshift集群 将数据插入其中 配置的机密管理器 配置 SageMaker 笔记本 打开Jupyter Notebook写入以下代码 import boto3
  • 将 C++ 指针作为参数传递给 Cython 函数

    cdef extern from Foo h cdef cppclass Bar pass cdef class PyClass cdef Bar bar def cinit self Bar b bar b 这总是会给我类似的东西 Can
  • 检查 python 中命令行参数的数量

    我是蟒蛇新手 还是把脚弄湿了 我正在尝试做这样的事情 import sys if len sys argv lt 3 or lt len sys argv gt 3 print This script will compare two fi
  • 以类型化内存视图作为成员的结构定义

    目前我正在尝试让一个具有类型化内存视图的结构能够工作 例如 ctypedef struct node unsigned int inds 如果 inds 不是内存视图 据我所知 它可以完美地工作 然而 通过内存视图并使用类似的东西 def
  • 如何使用 Homebrew 在 Mac 上安装 Python 2 和 3?

    我需要能够在 Python 2 和 3 之间来回切换 我如何使用 Homebrew 来做到这一点 因为我不想弄乱路径并陷入麻烦 现在我已经通过 Homebrew 安装了 2 7 我会用pyenv https github com yyuu
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • 仅当某些值相等时,如何才能将一个文本文件中的值替换为另一个文本文件中的其他值?

    我有一个名为finalscores txt我想创建一个 python 脚本 它将打开它并从两个单独的列中读取值 这是我的finalscores txt file Atom nVa predppm avgppm stdev delta QPr
  • Flask 应用程序路由中的多个参数

    烧瓶怎么写app route如果我在 URL 调用中有多个参数 这是我从 AJax 调用的 URL http 0 0 0 0 8888 createcm summary VVV change Feauure 我试图写我的烧瓶app rout
  • 检索 geodjango 多边形对象的边界框

    如何在 geodjango 中获取 MultiPolygon 对象的边界框 在 API 中找不到任何内容http geodjango org docs geos html http geodjango org docs geos html
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • numpy polyfit 中使用的权重值是多少以及拟合误差是多少

    我正在尝试对 numpy 中的某些数据进行线性拟合 Ex 其中 w 是该值的样本数 即对于点 x 0 y 0 我只有 1 个测量值 该测量值是2 2 但对于这一点 1 1 我有 2 个测量值 值为3 5 x np array 0 1 2 3
  • 仅允许正小数

    在我的 Django 模型中 我创建了一个如下所示的小数字段 price models DecimalField u Price decimal places 2 max digits 12 显然 价格为负或零是没有意义的 有没有办法将小数
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic

随机推荐

  • 网格单位向量中的元素替换

    我已经对此感到困惑好几次了 所以这里为其他可能偶然发现同样问题的人提出了一个虚构的问题 考虑这个网格单位向量 a unit 1 3 c cm in npc 我想用新值替换一些元素 自然的方法是 a 1 unit 2 pt a 1 2cm 2
  • 如何使用 javax.mail.internet.MimeBodyPart.setFileName 保留所有字符?

    我需要使用创建邮件javax mail版本 1 6 2 希望尽可能坚持高级方法 并希望避免自己处理字符编码 折叠以及最终获得有效邮件所需的任何内容 我目前正在处理的一个问题是文件名 因为默认情况下javax mail internet Mi
  • 如何在 Tridion 中获取当前登录用户的用户 ID?

    我在 Tridion 中实现了一个功能区工具栏按钮 作为其中的一部分 我需要循环访问一些组件 这需要有效的会话 要在 Tridion 中创建会话 我需要一个用户 ID 如何获取当前用户的User Id windows User Id 下面的
  • PHP 在函数中包含/需要

    是否可以在 PHP 函数内的包含文件中包含 return 语句 我希望这样做 因为我在单独的文件中有很多函数 并且它们在顶部都有大量共享代码 As in function sync include once file php echo Te
  • 快照图像不能用作舞台图标

    我正在尝试将舞台快照中的图像设置为舞台图标 下面的代码演示了它 import javafx application Application import javafx scene Scene import javafx scene imag
  • 视口、窗口、文档

    在下面的代码中 document documentElement clientWidth 1349 document documentElement clientHeight 363 window innerWidth 1366 windo
  • Gradle 多项目定义对根项目的依赖

    我有一个多项目 gradle 构建 以这种方式配置 root projectA projectB 我想在root build gradle所有嵌套项目的依赖项 这是文件 subprojects version 1 0 SNAPSHOT re
  • Blazor RenderFragment 到字符串

    我正在开发一个代码块组件 Net 6 Blazor wasm 我需要显示RenderFragment as string并在我的 html 中渲染该组件 这是我的代码块组件 pre class language html code clas
  • 服务崩溃,事件名称为 [CLR20r3] [重复]

    这个问题在这里已经有答案了 我已经创建了一项服务 Net c 基本上定期发送电子邮件 该服务在我的上运行良好x32 XP机器但是当我部署时x64 build基于另一个 x64 Windows Server 2008 R2机器 服务启动并在几
  • 寻找 CUDA 中的最大值

    我正在尝试在 CUDA 中编写代码来查找最大值 对于给定的一组数字 假设您有 20 个数字 并且内核在 2 个块 每块 5 个线程 上运行 现在假设 10 个线程同时比较前 10 个值 并且thread 2找到最大值 因此线程 2 正在更新
  • Ruby 调试“没有要加载的文件--spec_helper”

    菜鸟可能会错过一些明显的东西 我正在尝试调试 Rspec 文件 此时 Rspec 文件已被删除 require spec helper describe PagesController do render views describe GE
  • 此错误是否会带来不稳定的功能,使其无法与稳定的 Rust 版本一起使用?

    我正在研究这个仓库 https github com chunjiw oxd 它在 M2 笔记本电脑上的 MacOS 上构建没有问题 但是当我尝试在 Debian 桌面上构建它时 它显示以下错误 error E0554 feature ma
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • Hibernate 注释上分配的生成器类

    这里是休眠新手 我正在研究一个简单的 Hibernate 映射文件 当我使用 xml 方法时 我将生成器类设置为分配 在分配员工 ID 之前必须检查某些逻辑 因此我无法生成它 自动地
  • 更改选项并重新初始化

    我在用jscroll作为无限滚动寻呼机 j frontpage jscroll loadingHtml div style text align center img width 50 src ring alt 1 gif alt Load
  • Xcode 如何知道在哪里寻找框架?

    示例 我导入一个这样的框架 import
  • 如何使用 Java 确定 Windows 是 32 位还是 64 位体系结构?

    如何使用 Java 确定 Windows 是 32 位还是 64 位体系结构 我不太相信读取 os arch 系统变量 如果用户在 64 位系统上运行 64 位 JVM 则它可以工作 如果用户在 64 位系统上运行 32 位 JVM 则它不
  • 在 Java 17 switch-case 中使用 Final 变量的好处

    有人可以告诉我 Java 17 接受最终表达式作为 switch case constructs 中的 case 表达式但不接受最终表达式作为参数传递的好处吗 void test int distinction final int foo
  • Spring Data:查询注释中是否可以有子查询?

    我想知道是否可以在 Query 注释中包含子查询 org springframework data jpa repository Query 我在第一个子查询括号中收到 QuerySyntaxException 这是我的查询 Query v
  • 使用 psycopg2 类型存根注释返回类型

    如果可以建立连接 我有一个返回 psycopg2 连接的函数 所以返回类型应该是Optional psycopg2 connection or psycopg2 connection None 但是我无法导入psycopg2 connect