检查函数参数类型是 Pythonic 吗?

2024-02-15

我知道,Python 中通常不赞成对函数参数进行类型检查,但我认为我已经想到了这样做是有意义的。

在我的项目中,我有一个抽象基类Coord,有一个子类Vector,它具有更多功能,如旋转、改变大小等。数字列表和元组也将返回 Trueisinstance(x, Coord).我还有许多接受这些 Coord 类型作为参数的函数和方法。我已经设置了装饰器来检查这些方法的参数。这是一个简化版本:

class accepts(object):
    def __init__(self, *types):
        self.types = types

    def __call__(self, func):
        def wrapper(*args):
            for i in len(args):
                if not isinstance(args[i], self.types[i]):
                    raise TypeError

            return func(*args)

        return wrapper

这个版本很简单,但还是有一些bug。它只是为了说明这一点。它的用法如下:

@accepts(numbers.Number, numbers.Number)
def add(x, y):
    return x + y

注意:我仅根据抽象基类检查参数类型。

这是一个好主意吗?有没有更好的方法来做到这一点,而不必在每个方法中重复类似的代码?

Edit:

如果我要做同样的事情,但不是预先在装饰器中检查类型,而是在装饰器中捕获异常,该怎么办:

class accepts(object):
    def __init__(self, *types):
        self.types = types

    def __call__(self, func):
        def wrapper(*args):

            try:
                return func(*args)
            except TypeError:
                raise TypeError, message
            except AttributeError:
                raise AttributeError, message

        return wrapper

这样好点了吗?


您的品味可能会有所不同,但 Pythonic(tm) 风格是直接根据需要使用对象。如果它们不支持您尝试的操作,则会引发异常。这被称为鸭子打字 http://en.wikipedia.org/wiki/Duck_typing.

支持这种风格有几个原因:首先,它允许您在现有代码中使用新类型的对象,只要新对象支持正确的操作,从而实现多态性。其次,它通过避免大量检查来简化成功路径。

当然,使用错误参数时收到的错误消息通过类型检查会比鸭子类型更清晰,但正如我所说,您的口味可能会有所不同。

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

检查函数参数类型是 Pythonic 吗? 的相关文章

  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的

随机推荐

  • 使用 Typescript 热重载 IIS Web 服务器做出反应

    在使用 C Web Api 后端使用 TypeScript 开发 React 应用程序时 我想使用热重载 我使用 Net 框架而不是 Core 所以我需要使用 IIS 或 IIS Express 我可以使用前端热重载webpack dev
  • 在VS2015 RC上添加Native Tools命令提示符

    由于我在以下位置找不到 Native Tools CMDTools菜单 我尝试手动添加它外部工具 几个问题 不管我选择什么Command ARM x86 或 x64 等 Command总是C Windows System32 cmd exe
  • 在Android中使用Bundle代替直接Intent putExtra()的优点

    在我的android应用程序中我总是直接使用putExtra 的函数Intent类将任意数量的值传递给 newActivity 像这样 Intent i new Intent this MyActivity class i putExtra
  • 以编程方式将 Razor 页面呈现为 HTML 字符串

    Goal 我正在尝试按照我的意愿在后端生成 HTML 字符串 使用 HtmlToPDF 库将其转换为 PDF 我还希望能够在浏览器中轻松查看生成的 HTML 以进行调试 调整 该页面仅在以下情况下才会公开IsDevelopment 我希望它
  • Web Api 请求内容在操作过滤器中为空

    我有一个名为Log尝试将请求和响应的内容记录到文本文件中 我已将其放在我的控制器上以涵盖所有操作 在LogAttribute我正在以字符串形式读取内容 ReadAsStringAsync 所以我不会丢失请求正文 public class L
  • 如何删除带或不带空格的空行

    我有一个大字符串 我用换行符分割它 如何删除所有空行 仅限空白 伪代码 for stuff in largestring remove stuff that is blank 尝试列表理解和string strip http docs py
  • C++17 赋值排序:GCC 中仍未实现?

    我尝试了以下代码作为实现交换的天真的尝试R and B中的字节数ABGR word include
  • 为什么所需的 Startup 类不需要实现适当的接口,例如 IStartup?

    使用武士刀 为什么Startup类不应实现各自的接口 例如 interface IStartup void Configuration IAppBuilder app public class MyStartup IStartup publ
  • 在线求职门户系统用例图

    我想要一个在线求职门户系统的正确用例图 这是我的尝试 我有些疑惑 我看不出在哪里制作 登录 用例 这是该系统的一个重要用例 该用例图没有显示简单访问者和注册访问者之间的区别 前者可以查看职位空缺 查看建议 而无需拥有帐户 后者可以查看职位空
  • 使用 PyYAML.dump() 生成锚点?

    我希望能够在 PyYAML 的 dump 函数生成的 YAML 中生成锚点 有没有办法做到这一点 理想情况下 锚点应与 YAML 节点具有相同的名称 Example import yaml yaml dump a 1 2 3 a 1 2 3
  • 使用 php curl 抓取动态加载网站

    我是抓取新手 已经正式废弃了两个网站 但是当我尝试抓取动态加载网站时 问题出现了 当网站用 JavaScript 渲染时 我无法抓取网站的内容 有什么方法可以使用该网站的内容php curl或任何其他相关客户PHP 这就是我到目前为止所做的
  • 等到所有 jQuery Ajax 请求完成?

    如何让一个函数等待 直到所有 jQuery Ajax 请求在另一个函数内完成 简而言之 我需要等待所有 Ajax 请求完成后才能执行下一个请求 但如何呢 jQuery 现在定义了一个当函数 http api jquery com jQuer
  • F# 将元素添加到序列

    一个简单的问题我找不到答案 如何将元素添加到序列中 例如 我有一个 seq 和一个 newElem XElement 我想附加到它 Thanks 序列追加 gt let x 1 5 val x seq
  • 与普通对象类似地访问 JavaScript 映射

    我正在使用地图 因为我想存储一个对象作为键 我的问题是 我可以像访问普通对象一样访问地图吗 例如 let m new Map let obj foo bar m obj baz console log m obj 这应该按原样正常工作吗 还
  • 返回 R 中函数的函数

    我正在尝试创建一个创建并返回新函数的函数 我已经尝试过以下方法 但它不起作用 我想 myfunc lt function W myfunc2 function X Y W X return Y return myfunc2 我希望能够在 m
  • 示例设置.xml

    如何配置settings xml在马文 另外 请分享一个示例settings xml 这是带有注释的股票 settings xml 完整 未切割的文件位于底部 License
  • php:从字符串中删除 URL

    我有很多字符串 twitter 推文 当我回显它们时 我想从中删除链接 我无法控制该字符串 即使所有链接都以 http 开头 它们也可以以 或 结尾 不 并且后面是否有空格 此外 有时链接与其前面的单词之间没有空格 此类字符串的一个示例 T
  • 将 C++ 实例方法与 C 回调函数混合

    problem 我有一个来自 C 库的以下 C 回调签名Foo void RequestCallbackFunc int 该库还提供了用于注册所述回调的实用函数 extern void SetRequestCallback Requesta
  • 为 Mac 构建 libunwind

    我正在尝试在 Mac 上为 iOS 和 Mac 构建 libunwind 我能够解决一些编译问题 在 Mac 上构建 我使用配置项目 configure CC cc Ae D XOPEN SOURCE 500 并复制了elf h来自谷歌的
  • 检查函数参数类型是 Pythonic 吗?

    我知道 Python 中通常不赞成对函数参数进行类型检查 但我认为我已经想到了这样做是有意义的 在我的项目中 我有一个抽象基类Coord 有一个子类Vector 它具有更多功能 如旋转 改变大小等 数字列表和元组也将返回 Trueisins