我们如何在Python中通用地使用sin、cos、tan(包括用户定义的类型)?

2024-03-19

编辑:让我尝试改写并改进我的问题。旧版本附在底部。

我正在寻找一种以类型通用的方式表达和使用自由函数的方法。例子:

abs(x)  # maps to x.__abs__()
next(x) # maps to x.__next__() at least in Python 3
-x      # maps to x.__neg__()

在这些情况下,函数的设计方式允许具有用户定义类型的用户通过将工作委托给非静态方法调用来自定义其行为。这很好。它允许我们编写并不真正关心确切参数类型的函数,只要它们“感觉”像模拟某个概念的对象即可。

反例: 不易通用的函数:

math.exp  # only for reals
cmath.exp # takes complex numbers

假设,我想编写一个通用函数,将 exp 应用于类似数字的对象列表。我应该使用什么 exp 函数?我该如何选择正确的呢?

def listexp(lst):
    return [math.exp(x) for x in lst]

显然,即使有复数的 exp(在 cmath 中),这也不适用于复数列表。而且它也不适用于任何用户定义的类似数字的类型,这些类型可能提供自己的特殊 exp 函数。

所以,我正在寻找一种从双方角度处理这个问题的方法——理想情况下不需要对很多东西进行特殊的处理。作为一些不关心参数的确切类型的通用函数的编写者,我想使用特定于所涉及类型的正确数学函数,而不必显式处理这个问题。作为用户定义类型的编写者,我想公开特殊的数学函数,这些函数已被增强以处理存储在这些对象中的附加数据(类似于复数的虚部)。

执行此操作的首选模式/协议/习惯用法是什么?我还没有测试numpy。但我下载了它的源代码。据我所知,它为数组提供了一个 sin 函数。不幸的是,我还没有在源代码中找到它的实现。但看看他们如何为数组当前存储的正确类型的数字选择正确的 sin 函数将会很有趣。

在 C++ 中,我会依赖函数重载和 ADL(参数相关查找)。由于 C++ 是静态类型的,因此这(名称查找、重载解析)完全在编译时处理就不足为奇了。我想,我可以在运行时使用 Python 和 Python 提供的反射工具来模拟这一点。但我也知道尝试将一种编码风格导入另一种语言可能是一个坏主意,而且在新语言中也不是很惯用。因此,如果您对方法有不同的想法,我会洗耳恭听。

我想,在某个时候我需要以可扩展的方式手动执行一些依赖于类型的调度。也许编写一个模块“tgmath”(类型通用数学),它支持真实和复杂的支持,并允许其他人注册他们的类型和特殊情况函数......意见? Python大师们对此有何评论?

TIA

编辑:显然,我不是唯一对泛型函数和依赖于类型的重载感兴趣的人。有PEP 3124 http://www.python.org/dev/peps/pep-3124/但从4年前起它就处于草稿状态。


问题的旧版本:

我有很强的 Java 和 C++ 背景,最近才开始学习 Python。我想知道的是:我们如何扩展数学函数(至少是它们的名称)以便它们适用于其他用户定义的类型?这些类型的函数是否提供我可以利用的任何类型的扩展点/挂钩(类似于迭代器协议,其中next(obj)实际上委托给obj.__next__, etc) ?

在 C++ 中,我只需使用新的参数类型重载该函数,并让编译器找出哪些函数是使用参数表达式的静态类型表示的。但由于 Python 是一种非常动态的语言,因此不存在重载之类的事情。执行此操作的首选 Python 方法是什么?

另外,当我编写自定义函数时,我想避免长链

if isinstance(arg,someClass):
    suchandsuch
elif ...

我可以使用哪些模式来使代码看起来更漂亮、更Pythonish?

我想,我基本上是在尝试解决 Python 中函数重载不足的问题。至少在 C++ 中,重载和参数相关查找是良好 C++ 风格的重要组成部分。

是否有可能使

x = udt(something)  # object of user-defined type that represents a number
y = sin(x)          # how do I make this invoke custom type-specific code for sin?
t = abs(x)          # works because abs delegates to __abs__() which I defined.

工作?我知道我可以使 sin 成为该类的非静态方法。但随后我就失去了通用性,因为对于其他所有类型的类似数字的对象来说,它都是sin(x)并不是x.sin().

添加一个__float__方法是不可接受的,因为我在对象中保留了附加信息,例如“自动微分”的导数。

TIA

编辑:如果您对代码的样子感到好奇,请检查this http://ideone.com/H6z60出去。在理想的世界中,我将能够以类型通用的方式使用 sin/cos/sqrt。我认为这些函数是对象接口的一部分,即使它们是“自由函数”。在__somefunction我没有限定这些功能math. nor __main__.。它之所以有效,是因为我手动依靠math.sin(等等)通过装饰器在我的自定义函数中。但我认为这是一个丑陋的黑客行为。


你可以这样做,但它会倒退。你实施__float__()在你的新类型中然后sin()将与您的班级合作。

换句话说,您不能将 sine 调整为适用于其他类型;您可以调整这些类型,以便它们可以与正弦一起使用。

这更好,因为它强制一致性。如果没有从您的对象到浮点数的明显映射,那么可能没有合理的解释sin()对于那种类型。

[抱歉,如果我之前错过了“__float__ 不起作用”部分;也许您是为了回应这一点而添加的?无论如何,为了令人信服地证明你想要的东西是不可能的,python 有 cmath 库要添加sin()等等对于复数...]

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

我们如何在Python中通用地使用sin、cos、tan(包括用户定义的类型)? 的相关文章

  • ValueError:“连接”层需要具有匹配形状的输入(连接轴除外)

    我正在尝试为我的项目构建 Pix2Pix 并收到错误 值错误 Concatenate层需要具有匹配形状的输入 除了连接轴之外 获得输入形状 None 64 64 128 None 63 63 128 生成器是一个 U 网模型 我的输入高度
  • ipdb 和 pdb++ 之间的区别?

    Python 有一个名为 pdb 的默认调试器 但社区创建了一些替代品 其中两个是ipdb https github com gotcha ipdb and pdb https github com pdbpp pdbpp 它们似乎迎合了相
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • 引发 RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 导入 fitz 时目录 'static/' 不存在

    当我运行 extract img py 文件时出现此错误 RuntimeError f 目录 directory 不存在 运行时错误 导入 fitz 时不存在目录 static 我不明白为什么这会给我发回此错误消息 我之前看到过关于这个话题
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • 将 matplotlib png 转换为 base64 以在 html 模板中查看

    背景 你好 我正在尝试制作一个简单的网络应用程序 按照教程计算阻尼振动方程 并将结果的 png 返回到 html 页面 然后将其转换为 Base64 字符串 Problem 该应用程序运行正常 只是在计算结果时返回损坏的图像图标 可能是因为
  • 十六进制数的按位异或

    我们如何在 Python 中对十六进制数进行异或 例如 我想要异或 ABCD and 12EF 答案应该是 B922 我使用了下面的代码 但它给出了错误的结果 xor two strings of different lengths def
  • 理解@property装饰器和继承[重复]

    这个问题在这里已经有答案了 这里是 Python 3 以防万一它很重要 我试图正确理解如何实现继承 property使用 我已经搜索了 StackOverflow 并阅读了大约 20 个类似的问题 但无济于事 因为他们试图解决的问题略有不同
  • Selenium Webdriver - Python - leboncoin - pb 选择带重音的按钮

    我正在尝试在以下网站上自动填写表格 https www leboncoin fr https www leboncoin fr 我用 Selenium IDE 录制了一个脚本 我有一个通过单击 Se 连接器 按钮并填写我的密码和用户名来自动
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • InvalidArgumentException:消息:无效参数:“using”必须是字符串

    我对 python 很陌生 试图创建可重用的代码 当我尝试通过传递 Login 类下使用的所有参数来调用 test main py 中的 Login 类和函数 login user 时 我收到错误 InvalidArgumentExcept
  • 如何使用 jira-python 设置 fixVersions 字段

    我正在尝试使用 jira python 模块 http jira python readthedocs org en latest 更新现有的 JIRA 具体来说 我正在尝试设置问题的fixesVersion 列表 我已经尝试了一段时间但没
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • 如何在matplotlib中基于x轴更改直方图颜色

    我有根据 pandas 数据框计算出的直方图 我想根据 x 轴值更改颜色 例如 If the value is 0 the color should be green If the value is gt 0 the color shoul
  • python中打印字符串的长度

    有没有什么方法可以找到 即使是最好的猜测 Python中字符串的 打印 长度 例如 potaa bto 是 8 个字符len但 tty 上只打印 6 个字符宽 预期用途 s potato x1b 01 32mpotato x1b 0 0mp
  • 在 Tensorflow 2.0 中的简单 LSTM 层之上添加 Attention

    我有一个由一个 LSTM 和两个 Dense 层组成的简单网络 如下所示 model tf keras Sequential model add layers LSTM 20 input shape train X shape 1 trai
  • 测试中的模型 - Django 1.7 问题

    我正在尝试将我的项目移植为使用 Django 1 7 除了一件事之外 一切都很好 测试文件夹内的模型 Django 1 7 新迁移在内部运行 migrate 命令 在运行syncdb之前 这意味着如果模型未包含在迁移中 它将不会填充到数据库
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 在读/写二进制数据结构时访问位域

    我正在为二进制格式编写一个解析器 这种二进制格式涉及不同的表 这些表同样采用二进制格式 通常包含不同的字段大小 其中 50 100 个之间 大多数这些结构都有位域 并且在 C 语言中表示时看起来像这样 struct myHeader uns
  • Shap - 颜色条不显示在摘要图中

    显示summary plot时 不显示颜色条 shap summary plot shap values X train 我尝试过改变plot size 当绘图较高时 会出现颜色条 但它非常小 看起来不应该 shap summary plo

随机推荐

  • 在 MSBuild 中,我可以在元数据项上使用 String.Replace 函数吗?

    在 MSBuild v4 中 可以使用函数 例如string replace on 特性 但是我怎样才能使用函数Metadata 我想使用string replace功能如下
  • 如何从 rake 文件运行 ruby​​ 类?

    我想运行一个 ruby 类样本 rake file 考虑myruby rb是一个红宝石文件 我想从以下位置运行这个样本 rake like ruby myruby rb 添加一个示例脚本来添加 tobias 在这里所说的内容 样本内容myr
  • 数组的渲染 json 问题

    我有来自我的服务器的这个数组 当我使用 put 时返回如下 formatted total price Acirc pound 66 00 formatted total price Acirc pound 128 00 formatted
  • 按钮点击声音

    这就是我想做的 我有大约 30 个按钮 我希望当点击每个按钮时 它会播放不同的mp3文件 像这样http www soundjig com pages soundfx beeps html http www soundjig com pag
  • 如何从 TypeScript 中的通用部分构建目标对象?

    我在用 电子邮件受保护 cdn cgi l email protection 我有一个目标对象 interface MyTarget a string b string c string d string 我想使用泛型创建部分对象的多个转换
  • jquery-confirm 对话框中的 jQuery UI 日期选择器

    我正在使用下面链接中的 jquery confirm 脚本 它能够在对话框中包含表单字段 您可以通过单击下面链接中的 按提示操作 蓝色按钮来查看此内容 我已经设置了表单 单个字段 但我希望这个输入是一个日期选择器 并且我不知道应该在哪里放置
  • Django Q 查询 & 在同一字段上?

    这是我的模型 class Event models Model user models ForeignKey User blank True null True db index True name models CharField max
  • 下拉菜单中的 jvectormaps,NS_ERROR_FAILURE:

    我的 jvector 地图位于下拉菜单中 它在 safari opera 和 chrome 中运行良好 但会损坏 没有地图 和错误消息 NS ERROR FAILURE 2 0 2 min js 第 700 行 return this no
  • LinkedList不能序列化?

    这是我的课程 http pastebin com 3dc5Vb1t http pastebin com 3dc5Vb1t 当我尝试跑步时 BookStore b new BookStore b LoadFromXML Server MapP
  • 如何替换 Tkinter 应用程序中的图标?

    我在 Windows 10 上使用 Python 3 5 0 并且想要替换它 要更改图标 您应该使用iconbitmap or wm iconbitmap我的印象是您想要将其更改为的文件必须是 ico 文件 import tkinter a
  • C#:GPS跟踪系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C net 中构建带有移动设备 带 GPS 的 GPS 跟踪系统 场景是 通过支持 GPS 的手机跟踪用户 服务工程师 这里没
  • 保持鼠兔 BlockingConnection 存活而不禁用心跳

    我正在使用 pika 0 10 0 和 python 2 7 版本开发 RabbitMQ 消费者 在我的消费者客户端中 我有一个根据输入消息运行一段时间的进程 时间可能从 3 到 40 分钟不等 我不想禁用心跳 相反 我正在寻找一些回滚机制
  • Ruby on Rails - 简单表单自动完成关联搜索

    我在基本任务管理应用程序中有一个表单 允许将任务分配给用户 任务属于用户 我为此使用简单表格 目前 该关联以典型方式填充 带有用户下拉列表 如下所示 但是 随着用户数量的增长 我希望将其更改为自动完成表单字段以查找用户 我尝试过遵循Rail
  • 使用原生SQL查询时如何指定数据类型?

    我正在使用休眠 我已经编写了本机 SQL 查询 我想指定其中一列的数据类型 如下所示 sqlQuery addScalar NAME STRING 我正在查询 5 列并且ID是其中的一栏 但如果我使用addScalar 它不返回所有列 只返
  • 用于 BLE 的 BluezV5.42 DBUS C API?

    我开发了 BLE 应用程序openwrt using BLUEZV5 30 我能够通过提取源代码来创建应用程序gatttool and hcitool 我还添加了这些工具提供的更多功能 例如阅读rssi 不过 我已经升级了我的bluez堆叠
  • JSON.net - 字段可以是 string 或 List

    我有一种情况JSON从一个返回REST service 返回电影对象列表 所有对象都包含大量信息 其中有几个字段REST 服务结果根据可用信息而变化 举个例子 电影总是有一些屏幕截图 图像 演员和导演 根据所讨论的电影 可能有一张或多张图像
  • Intersection Observer rootMargin 在 x 轴上未按预期工作

    我正在尝试使用交集观察器 API 为一个侧面项目实现图像延迟加载 我面临的问题是 无论我如何调整 x 轴的 rootMargin 例如 0px 300px 0px 0px 交叉点似乎只发生在视口上 预期 在进入视口之前相交 300px 时加
  • 是否可以在 C# 类库中创建 Windows 窗体?

    我一直在用 C 构建 DLL 类库 用作提供自定义 API 的应用程序的附加组件 到目前为止 它们主要包括与数据库 计算 磁盘操作等的接口 我很想知道是否可以在 DLL 类库内构建和显示 Windows 窗体 显示文本框 按钮等 I tri
  • 如果“cargo build”比直接运行 rustc 慢,为什么我应该使用 Cargo?

    我创建了一个简单的 hello world 程序 fn main println Hello world 编译代码时使用rustc vs cargo build 货物命令显得较慢 它需要1 6s for cargo build vs 1s
  • 我们如何在Python中通用地使用sin、cos、tan(包括用户定义的类型)?

    编辑 让我尝试改写并改进我的问题 旧版本附在底部 我正在寻找一种以类型通用的方式表达和使用自由函数的方法 例子 abs x maps to x abs next x maps to x next at least in Python 3 x