向 Python 函数添加属性的最佳方法

2024-05-28

以计算数学函数的 Python 函数为例:

def func(x, a, b, c):
    """Return the value of the quadratic function, ax^2 + bx + c."""

    return a*x**2 + b*x + c

假设我想以函数属性的形式“附加”一些进一步的信息。例如,LaTeX 表示形式。我知道这要归功于PEP232 https://www.python.org/dev/peps/pep-0232/#examples我可以在函数定义之外执行此操作:

def func(x, a, b, c):
    return a*x**2 + b*x + c
func.latex = r'$ax^2 + bx + c$'

但我想在函数定义本身内完成它。如果我写

def func(x, a, b, c):
    func.latex = r'$ax^2 + bx + c$'
    return a*x**2 + b*x + c

这当然有效,但是仅在那之后我已经打电话给func第一次(因为Python在执行函数时很“懒”(?))

编写可调用类是我唯一的选择吗?

class MyFunction:
     def __init__(self, func, latex):
         self.func = func
         self.latex = latex

     def __call__(self, *args, **kwargs):
         return self.func(*args, **kwargs)

func = MyFunction(lambda x,a,b,c: a*x**2+b*x+c, r'$ax^2 + bx + c$')

或者我忽略了语言的一个功能来巧妙地做到这一点?


实现此目的的更好方法是使用装饰器,为此您有两种选择:

基于函数的装饰器:

您可以创建一个基于函数的装饰器,它接受乳胶表示形式作为参数,并将其附加到它装饰的函数上:

def latex_repr(r):
    def wrapper(f):
        f.latex = r
        return f
    return wrapper

然后您可以在定义函数时使用它并提供适当的表示:

@latex_repr(r'$ax^2 + bx + c$')
def func(x, a, b, c):
    return a*x**2 + b*x + c

这翻译为:

func = latex_repr(r'$ax^2 + bx + c$')(func)

并使得latex属性在定义函数后立即可用:

print(func.latex)
'$ax^2 + bx + c$'

我已将表示形式设为必需参数,如果您不想强制始终给出表示形式,则可以定义一个合理的默认值。

基于类的装饰器:

如果您更喜欢类,那么基于类的装饰器也可以比您最初的尝试以更 Pythonic 的方式用于实现类似的效果:

class LatexRepr:
    def __init__(self, r):
        self.latex = r

    def __call__(self, f):
        f.latex = self.latex
        return f

你以同样的方式使用它:

@LatexRepr(r'$ax^2 + bx + c$')
def func(x, a, b, c):
    return a*x**2 + b*x + c

print(func.latex)
'$ax^2 + bx + c$'

Here LatexRepr(r'$ax^2 + bx + c$')初始化类并返回可调用实例(__call__定义)。其作用是:

func = LatexRepr(r'$ax^2 + bx + c$')(func)
#                   __init__    
#                                  __call__

并做同样的事情wrapped does.


由于它们都只是向函数添加一个参数,因此它们只是按原样返回它。他们不会用另一个可调用的来替换它。

尽管基于类的方法可以解决问题,但基于函数的装饰器应该更快、更轻量。


You additionally asked:
"because Python is "lazy" in executing functions": Python just compiles the function body, it doesn't execute any statements inside it; the only thing it does execute is default argument values (See famous Q here https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument/34172768#34172768). That's why you first need to invoke the function for it to 'obtain' the attribute latex.

The additional downside to this approach is that you execute that assignment everytime you invoke the function

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

向 Python 函数添加属性的最佳方法 的相关文章

  • Python Flask 删除请求

    我正在开发一个 Python 应用程序并使用 Flask 这是我的 DELETE 函数 app route DeleteMessage methods DELETE def DeleteMessage messages Message qu
  • 使用不带引号的块样式的 Python YAML 转储

    如何使用 PyYAML 加载和转储 YAML 以便它尽可能地使用原始样式 我有 Python 来加载和转储 YAML 数据 例如 import sys import yaml def represent dictorder self dat
  • 我如何知道Python的unicode函数识别的所有支持的编码

    Python 有一个unicode将字节流转换为 unicode 字符串的内置函数 我只是希望我能查询所有可用的encoding在我的系统上 但如何 这个问题的原因是 有人使用 MAC OS X 向我发送了一封内容编码为 iso 2022
  • 为什么Flask后台线程获取错误的数据库信息?

    为了将实时数据库信息推送到客户端 我在服务器端使用flask socketio 通过使用websocket将所有实时数据库信息推送到客户端 我的视图文件有一个片段 from models import Host from flask soc
  • 使用 Python 访问内存映射文件

    我希望利用激战 2 中的内存映射文件 该文件旨在链接到 Mumble 以获得位置音频 该文件包含有关字符坐标的信息和其他有用的信息 我已经能够使用此脚本访问坐标信息 import mmap import struct last while
  • 并行执行按位运算的代码

    我有这段代码 通过将该 AU 矩阵的每个字节 8 个元素打包到 A 中来减少内存消耗 从而使 100k 200k 矩阵占用更少的空间 正如您所期望的 这段代码需要永远运行 我也计划将行数增加到 200k 我正在一个非常强大的实例 CPU 和
  • ValueError:字符 U+6573552f...Py2aap

    我制作了一个非常简单的程序 我正在尝试将其导出到应用程序文件 我目前正在使用 Python 3 6 和 py2app 将 py 文件转换为 app 所以我创建了安装文件 from setuptools import setup OPTION
  • 为什么我的字符串中出现不需要的换行符?

    这应该很简单 这很愚蠢 但我无法让它发挥作用 我有一个在读取文件时定义的标头 if gene env in line or gene HIV2gp7 in line header line 现在这个标题看起来像 gt lcl NC 0018
  • Python Jinja2 调用宏会导致(不需要的)换行符

    我的 JINJA2 模板如下所示 macro print if john name if name John Hi John endif endmacro Hello World print if john Foo print if joh
  • Plotly:如何在堆叠条形图顶部显示值的总和以及各个条形值?

    我正在尝试在 Python 中的 Plotly Express 中添加每个堆叠条形顶部的总计以及各个条形值 import plotly express as px df px data medals long fig px bar df x
  • 如何在 Google App Engine (Python) 中定义配置变量/常量?

    我是 python GAE 的新手 想知道如何快速定义和使用全局设置变量 所以说你 git 克隆我的 GAE 应用程序 然后打开config yaml 添加更改设置 应用程序就全部连接起来 如下所示 config yaml or whate
  • 如何在我的 GUI 上绘图

    我正在设计一个 GUIPyQt当我单击一个按钮来绘制我创建的函数的数据图时 我需要显示一个 matplotlib pylab 窗口 它就像 Matlab 中使用的运行时 每次按下该按钮时 我都想将 matplotlib pylab 窗口保留
  • Python父类访问子私有变量

    以下代码会生成错误 class A object def say something self print self foo print self bar class B A def init self self foo hello sel
  • 过滤给定范围内的坐标

    我有数百个带有地理位置的 out 文件 我将把它们批量导入到 SQLite 数据库中 但是 为了节省时间 我只会导入地理坐标在某些间隔内的线 文件是这样的 value value longitude latitude value value
  • python请求ssl握手失败

    每次我尝试这样做 requests get https url 我收到这条消息 import requests gt gt gt requests get https reviews gethuman com companies Trace
  • Python for 循环前瞻

    我有一个 python for 循环 其中我需要向前查看一项以查看在处理之前是否需要执行某项操作 for line in file if the start of the next line 0 perform pre processing
  • tkinter 库 treectrl 转换为 exe 安装程序时出现 cx_freeze 错误

    我使用的是 python 版本 3 7 我使用了这个名为 treectrl 的外部库 当我运行 py 文件时它工作得很好 但是当我使用 cx freeze 转换为 exe 文件时 它给了我错误 NomodulleFound 名为 tkint
  • Python - 将列表作为参数传递给 SQL,以及更多变量

    我试图在 python 3 6 中将未知数量的参数传递给 SQL Server 这是我使用 pypyodbc 的代码 cursor cnxn cursor theargs 1033286869 1053474957 1063654630 1
  • 导入错误:无法导入名称

    我有一个名为 google translate python 的库 https github com terryyin google translate python https github com terryyin google tra
  • 定义Python类时,如何在其中设置随机变量?

    假设我有一个名为Person 其中只有该人的姓名和性别 性别应从男性和女性中随机选择 为此 我导入random randint 功能 根据随机int确定随机性别 import random class Person alias random

随机推荐

  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 默认情况下 dbo 架构中的 EF 6 Code First __MigrationHistory

    我是代码优先实体框架的新手 第一次运行我的应用程序后登录数据库时 当我看到 MigrationHistory 表时 我有点困惑 我现在了解对此表的需求 但不喜欢它位于用户表内的标准 dbo 模式中 我认为它很唐突且有风险 我的第一个想法是将
  • 单击时未调用 UITableView didSelectRowatIndexPath

    非常非常奇怪 它在任何地方都有效 但在这里 void tableView UITableView aTableView didSelectRowAtIndexPath NSIndexPath indexPath MyViewControll
  • 在 LINQ 中确定具有分钟精度的日期时间值的相等性

    我需要使用分钟精度比较两个日期时间值以确定相等 完全相同 这是最好的方法吗 我的日期可能有秒和毫秒 但我只想考虑到分钟 where Math Abs datetime1 Subtract datetime2 TotalMinutes 0 检
  • 让 NUMBERFMT 填充默认值的简单方法?

    我正在使用 Windows API获取数字格式Ex http msdn microsoft com en us library dd318113 28v vs 85 29 aspx使用当前用户的适当本地化选项来格式化一些数字以进行显示 例如
  • 在C中将毫秒转换为秒

    简单的C问题 如何正确 简洁地将毫秒转换为秒 有两个限制 我在这个微小的 C 编译器子集中没有浮点支持 我需要将秒四舍五入到最接近的秒 1 499ms 向下舍入 500 999ms 向上舍入 不需要关心负值 int mseconds 160
  • 如何使用npm安装本地网络中的所有节点模块?

    我的节点应用程序将部署在无法访问互联网的银行中 我可以将所有节点模块下载到本地目录中并从中安装它们 还是将node modules复制到银行机器上 任何安全实用的建议将不胜感激 谢谢 OR 如何添加node modules不使用依赖项int
  • 如何在不影响背景内容的情况下弯曲底部导航栏角?扑

    我创建了一个带有颤动的自定义底部导航栏 但我仍然可以看到白色填充了弧角后面的背景 我想看看背景内容 这就是底部导航栏的样子 正如你所看到的 角落里充满了白色 这是我的底部导航栏代码 bottomNavigationBar Container
  • 管理 C++ 构造函数中的 bad_alloc 异常

    我有 Java 经验 最近正在做一些 C 编码 我的问题是 如果我有类 A 我必须将类 B 和类 C 实例化为 A 的两个成员变量 如果在 A 的构造函数中 我是否应该假设类 B 和 C 的分配永远不会失败 并在 A 的析构函数中处理错误分
  • 特定日期的plotly js图像标记

    我正在使用这个例子 https plot ly javascript images add multiple images https plot ly javascript images add multiple images并尝试在特定日
  • MVVM Light Toolkit 抛出 System.IO.FileLoadException

    我正在运行 VS 2010 和 Expression Blend 4 beta 我从提供的模板创建了一个 MVVM Light 项目 当我尝试在 VS 2010 设计器窗口中查看 MainWindow Xaml 时 出现 System IO
  • Pandas - 修改每个单元格中的字符串值

    我有一个 pandas 数据框 我需要修改给定字符串列中的所有值 每列包含相同长度的字符串值 用户提供他们想要为每个值替换的索引 例如 1 3 和重置价值 AAA 这会将值 1 到 3 中的字符串替换为值AAA 我怎样才能使用applyma
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 如何在 Popup div 中加载 iframe 内容?

    如何在 Popup div 中加载 iframe 内容 单击每个链接时将打开弹出 div 从每个链接 页面 url 将加载到弹出 div 内的 iframe href document ready function openpop clic
  • 如何使用固定宽度的卡片制作卡片组?

    我想做一个响应式的卡牌 https getbootstrap com docs 4 0 components card card decks使用引导4固定宽度卡片 https getbootstrap com docs 4 0 compon
  • 使用键盘快捷键浏览代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I m starting to feel the need to run fastly through code with keybo
  • 您如何构建 SVN 存储库? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 什么是更好的 A server 1080 repo projectA trunk branches branch1 branches branc
  • PHP:如何将信息返回到等待的脚本并继续处理

    假设有两个脚本Requester php和Provider php Requester需要Provider进行处理并向其发出http请求 Provider php data data 在这种情况下 Provider 很快就找到了答案 但为了
  • 不要使用对象作为类型

    我收到 lint 错误 不要使用对象作为类型 当我使用对象作为类型时 示例如下 export const myFunc obj object string gt return obj toString 知道我应该为具有未知属性的对象赋予什么
  • 向 Python 函数添加属性的最佳方法

    以计算数学函数的 Python 函数为例 def func x a b c Return the value of the quadratic function ax 2 bx c return a x 2 b x c 假设我想以函数属性的