在 Python 中进行自动属性分配的最佳方法是什么?这是一个好主意吗?

2024-01-15

而不是每次定义类时都编写这样的代码:

class Foo(object): 
     def __init__(self, a, b, c, d, e, f, g):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f
        self.g = g

我可以用这个自动属性分配的秘诀 http://code.activestate.com/recipes/551763/.

class Foo(object):
     @autoassign
     def __init__(self, a, b, c, d, e, f, g):
        pass

两个问题:

  1. 此快捷方式是否有缺点或陷阱?
  2. 有没有更好的方法来实现类似的便利?

关于自动分配代码的一些问题让我感到困扰(主要是风格上的问题,但还有一个更严重的问题):

  1. autoassign不分配 'args' 属性:

    class Foo(object):
        @autoassign
        def __init__(self,a,b,c=False,*args):
            pass
    a=Foo('IBM','/tmp',True, 100, 101)
    print(a.args)
    # AttributeError: 'Foo' object has no attribute 'args'
    
  2. autoassign就像装饰器一样。 但autoassign(*argnames)打电话给 返回装饰器的函数。 为了实现这个魔法,autoassign需要测试它的第一个类型 争论。如果有选择的话我 更喜欢函数而不是测试 其参数的类型。

  3. 似乎有相当大的 用于设置的代码量sieve, lambda 内的 lambda, ifilters 和很多条件。

    if kwargs:
        exclude, f = set(kwargs['exclude']), None
        sieve = lambda l:itertools.ifilter(lambda nv: nv[0] not in exclude, l)
    elif len(names) == 1 and inspect.isfunction(names[0]):
        f = names[0]
        sieve = lambda l:l
    else:
        names, f = set(names), None
        sieve = lambda l: itertools.ifilter(lambda nv: nv[0] in names, l)
    

    我认为可能有一个更简单的方法。 (看 以下)。

  4. for _ in itertools.starmap(assigned.setdefault, defaults): pass。我不认为map or starmap本来是要打电话 函数,其唯一目的是它们 副作用。本来可以是 用平凡的方式写得更清楚:

    for key,value in defaults.iteritems():
        assigned.setdefault(key,value)
    

这是一个替代的更简单的实现,它具有与自动分配相同的功能(例如可以包含和排除),并且解决了上述几点:

import inspect
import functools

def autoargs(*include, **kwargs):
    def _autoargs(func):
        attrs, varargs, varkw, defaults = inspect.getargspec(func)

        def sieve(attr):
            if kwargs and attr in kwargs['exclude']:
                return False
            if not include or attr in include:
                return True
            else:
                return False

        @functools.wraps(func)
        def wrapper(self, *args, **kwargs):
            # handle default values
            if defaults:
                for attr, val in zip(reversed(attrs), reversed(defaults)):
                    if sieve(attr):
                        setattr(self, attr, val)
            # handle positional arguments
            positional_attrs = attrs[1:]
            for attr, val in zip(positional_attrs, args):
                if sieve(attr):
                    setattr(self, attr, val)
            # handle varargs
            if varargs:
                remaining_args = args[len(positional_attrs):]
                if sieve(varargs):
                    setattr(self, varargs, remaining_args)
            # handle varkw
            if kwargs:
                for attr, val in kwargs.items():
                    if sieve(attr):
                        setattr(self, attr, val)
            return func(self, *args, **kwargs)
        return wrapper
    return _autoargs

这是我用来检查其行为的单元测试:

import sys
import unittest
import utils_method as um

class Test(unittest.TestCase):
    def test_autoargs(self):
        class A(object):
            @um.autoargs()
            def __init__(self,foo,path,debug=False):
                pass
        a=A('rhubarb','pie',debug=True)
        self.assertTrue(a.foo=='rhubarb')
        self.assertTrue(a.path=='pie')
        self.assertTrue(a.debug==True)

        class B(object):
            @um.autoargs()
            def __init__(self,foo,path,debug=False,*args):
                pass
        a=B('rhubarb','pie',True, 100, 101)
        self.assertTrue(a.foo=='rhubarb')
        self.assertTrue(a.path=='pie')
        self.assertTrue(a.debug==True)
        self.assertTrue(a.args==(100,101))        

        class C(object):
            @um.autoargs()
            def __init__(self,foo,path,debug=False,*args,**kw):
                pass
        a=C('rhubarb','pie',True, 100, 101,verbose=True)
        self.assertTrue(a.foo=='rhubarb')
        self.assertTrue(a.path=='pie')
        self.assertTrue(a.debug==True)
        self.assertTrue(a.verbose==True)        
        self.assertTrue(a.args==(100,101))        

    def test_autoargs_names(self):
        class C(object):
            @um.autoargs('bar','baz','verbose')
            def __init__(self,foo,bar,baz,verbose=False):
                pass
        a=C('rhubarb','pie',1)
        self.assertTrue(a.bar=='pie')
        self.assertTrue(a.baz==1)
        self.assertTrue(a.verbose==False)
        self.assertRaises(AttributeError,getattr,a,'foo')

    def test_autoargs_exclude(self):
        class C(object):
            @um.autoargs(exclude=('bar','baz','verbose'))
            def __init__(self,foo,bar,baz,verbose=False):
                pass
        a=C('rhubarb','pie',1)
        self.assertTrue(a.foo=='rhubarb')
        self.assertRaises(AttributeError,getattr,a,'bar')

    def test_defaults_none(self):
        class A(object):
            @um.autoargs()
            def __init__(self,foo,path,debug):
                pass
        a=A('rhubarb','pie',debug=True)
        self.assertTrue(a.foo=='rhubarb')
        self.assertTrue(a.path=='pie')
        self.assertTrue(a.debug==True)


if __name__ == '__main__':
    unittest.main(argv = sys.argv + ['--verbose'])

附言。使用autoassign or autoargs与 IPython 代码完成兼容。

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

在 Python 中进行自动属性分配的最佳方法是什么?这是一个好主意吗? 的相关文章

  • Docker 进程被神秘的“Killed”消息杀死

    在 docker 容器中运行 python 脚本 一切似乎都运行顺利 看到一些 STDOUT 消息 大约 5 分钟后我得到了Killed消息 没有进一步的解释 并且该过程停止 查询数据库可能是磁盘空间问题 也可能是 OOM 问题 我不确定
  • 使用 Marshmallow 中的数据更新行 (SQLAlchemy)

    我正在使用 Flask Flask SQLAlchemy Flask Marshmallow marshmallow sqlalchemy 尝试实现 REST api PUT 方法 我还没有找到任何使用 SQLA 和 Marshmallow
  • Python:多处理和请求

    以下是我正在运行的使用多处理并行触发 HTTP 请求的代码片段 在控制台上运行后 它挂在 requests get url 处 既不继续前进也不抛出错误 def echo 100 q print before r requests get
  • 运行源代码中包含 Unicode 字符的 Python 2.7 代码

    我想运行一个在源代码中包含 unicode utf 8 字符的 Python 源文件 我知道这可以通过添加评论来完成 coding utf 8 在一开始的时候 但是 我希望不使用这种方法来做到这一点 我能想到的一种方法是以转义形式编写 un
  • 将 stdout 重定向到 Python 中的文件? [复制]

    这个问题在这里已经有答案了 如何将 stdout 重定向到 Python 中的任意文件 当长时间运行的 Python 脚本 例如 Web 应用程序 从 ssh 会话内启动并处于后台 并且 ssh 会话关闭时 应用程序将引发 IOError
  • Python 中的二进制相移键控

    我目前正在编写一些代码 以使用音频转换通过激光传输消息 文件 和其他数据 我当前的代码使用 python 中 binascii 模块中的 hexlify 函数将数据转换为二进制 然后为 1 发出一个音调 为 0 发出不同的音调 这在理论上是
  • Python/Flask:应用程序在关闭后正在运行

    我正在开发一个简单的 Flask Web 应用程序 我使用 Eclipse Pydev 当我开发该应用程序时 由于代码更改 我必须经常重新启动该应用程序 这就是问题所在 当我运行该应用程序时 我可以在本地主机上看到该框架 这很好 但是当我想
  • Python将csv数据导出到文件中

    我有以下运行良好的代码 但我无法修剪数据并将其存储在数据文件中 import nltk tweets love this car this view amazing not looking forward the concert def g
  • 从文档字符串生成 sphinx 文档不起作用

    我有一个具有以下结构的项目 我想保留 my project build here is where sphinx should dump into requirements txt make bat Makefile more config
  • 如何创建指向指针数组的 Python ctypes 指针

    我需要学习如何处理char 在下面的 C 方法中通过 Python ctypes 我通过使用调用其他只需要单个指针的方法做得很好create string buffer 但此方法需要一个指向指针数组的指针 ladybugConvertToM
  • 将带有两层分隔符的字符串转换为字典 - python

    给定一个字符串 s x t1 ny t2 nz t3 我想转换成字典 sdic x 1 y 2 z 3 我通过这样做让它工作 sdic dict tuple j split t for j in i for i in s split n F
  • 如何在 Numpy 中实现垃圾收集

    我有一个名为main py 它引用另一个文件Optimisers py它仅具有功能并用于for循环进入main py 这些函数都有不同的优化功能 This Optimisers py然后引用另外两个类似的文件 其中也只有函数 它们位于whi
  • 如何在 Spyder IDE 中安装 Selenium 包

    我刚刚在工作中安装了 Spyder IDE 仅 Spyder 不是整个 Anaconda 并且希望使用 FireFox 自动化我的工作 我的问题是 如何安装 Selenium 软件包 I figured it out Here is ins
  • 如何在 Tkinter 的 Button 小部件中创建多个标签?

    我想知道如何在 Tkinter 中创建具有多个标签的按钮小部件 如下图所示 带有子标签的按钮 https i stack imgur com jOZRw jpg正如您所看到的 在某些按钮中有一个子标签 例如按钮 X 有另一个小标签 A 我试
  • 如何使用 python-gnupg 加密大型数据集而不占用所有内存?

    我的磁盘上有一个非常大的文本文件 假设它是 1 GB 或更多 还假设该文件中的数据有 n每 120 个字符一个字符 我在用python gnupg https pythonhosted org python gnupg 对此文件进行加密 由
  • 从 subprocess.Popen 获取整个输出

    我通过调用 subprocess Popen 得到了一个有点奇怪的结果 我怀疑这与我对 Python 的陌生有很大关系 args cscript USERPROFILE tools jslint js USERPROFILE tools j
  • 在 Gensim 中通过 ID 检索文档的字符串版本

    我正在使用 Gensim 进行一些主题建模 并且已经达到使用 LSI 和 tf idf 模型进行相似性查询的程度 我取回 ID 集和相似点 例如 299501 0 64505910873413086 如何获取与 ID 在本例中为 29950
  • 在没有numpy的情况下在python中分配变量NaN

    大多数语言都有一个 NaN 常量 您可以使用它为变量分配值 NaN python 可以在不使用 numpy 的情况下做到这一点吗 是的 使用math nan https docs python org 3 library math html
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 获取长度为 n 的所有(n-选择-k)组合

    我怎样才能获得长度的所有组合 按顺序 n从数字列表中 例如 给定列表 1 2 3 4 并设置n 3 我怎样才能得到这些结果 1 2 3 1 2 4 1 3 4 2 3 4 For combinations of all possible l

随机推荐

  • 通知图标在通知托盘上为白色

    我的通知托盘上的应用程序图标在 Android 5 上变成白色 我见过这个Android 5 Lollipop 中通知栏图标变白 https stackoverflow com questions 28387602 notification
  • 如何在 Windows 窗体应用程序中创建 Alt 快捷方式?

    我想为 Windows 窗体应用程序中的某些控件创建键盘快捷键 Example 注意带下划线的 F E V P B I have a label and a textbox control I d like to associate tha
  • 可以检测页面抓取吗?

    所以我刚刚创建了一个为我执行页面抓取的应用程序 并运行它 效果很好 我想知道是否有人能够弄清楚代码正在被页面抓取 无论他们是否为此目的编写了代码 我用java编写了代码 它几乎只是检查一行html代码 我想在向该程序添加更多代码之前我应该
  • CGContextClipToMask 返回空白图像

    我是石英新手 我有 2 个图像 一个背景和一个带有剪切形状的蒙版 我想将其放置在背景上以剪切出一部分 生成的图像应该是切口的形状 这是我的面具 中间的形状是 0 alpha 这是我的代码 UIView canvas sender super
  • 稍后发送电子邮件

    我想知道是否 v1 0 me sendMail具有延迟发送电子邮件的能力 在 Outlook 客户端中 您可以指定希望在稍后的日期和时间发送电子邮件 我四处探听 看看是否有一个属性可以在消息对象上设置来指示这一点 有人找到办法让它工作吗 当
  • iOS 在 UIWebView 表单输入中使用 UIKeyboardTypeDecimalPad

    我想用 显示小数点 在基于 cordova 的应用程序中本机应用程序使用的左上角 我见过很多使用私有 API 等的线程 但我想要一个可以用于应用程序商店提交的解决方案 任何帮助表示赞赏 我已经尝试过一些东西 this https stack
  • “范围错误:超出最大调用堆栈大小”为什么?

    如果我跑 Array apply null new Array 1000000 map Math random 在 Chrome 33 上 我得到 RangeError Maximum call stack size exceeded Wh
  • 如何在两个不同的核心数据模型之间共享实体

    我想知道如何在两个不同的核心数据模型之间共享实体 例如 我有一个 Universe 模型描述了 世界数据 以其 国家数据 另一方面 我有一个 人口 模型 它描述了 人类数据 以其 国家数据 我绝对希望将我的模型分开 提前致谢 你检查过了吗核
  • 在QML中动态创建ListModel

    当我需要在运行时创建任何 QML 组件时 我可以使用该指南 http qt project org doc qt 5 qtqml javascript dynamicobjectcreation html http qt project o
  • 输入字段值中的 HTML

    如何让 HTML 在输入字段的值中起作用 如果值中包含 HTML 它将显示为纯文本 有没有办法做这样的事情
  • 在 MATLAB 中嵌入 Python

    我正在尝试将 Python 2 6 嵌入到 MATLAB 7 12 中 我想嵌入一个用 C 编写的 mex 文件 这对于使用标量的小型简单示例来说效果很好 但是 如果以任何方式导入 Numpy 1 6 1 MATLAB 都会崩溃 我说无论如
  • Spring微服务端到端测试

    我想为使用 Spring Boot 构建的管道编写端到端测试 考虑两个微服务 A B 其中 B 消耗 A 的输出并生成 RESTful API 它们使用rabbitmq连接并依赖外部数据库 我想实现类似的目标 创建一个包含两个微服务的新项目
  • 如何从 RabbitMQ 获取旧消息?

    我使用 Bunny Ruby 发布 RabbitMQ 消息 如下所示 x publish Message n to s routing key gt mychannel 并像这样订阅 ch conn create channel x ch
  • Autofac - 构建前解决

    使用 Unity 可以在构建容器之前解决依赖关系 Autofac 也可以吗 下面的代码演示了我的场景 我需要解决ICacheRepository为了 更新 单例CacheHelper 在 Unity 中 这可以简单地完成container
  • 4 个浮动 DIV 在使用 CSS 的缩小屏幕上对称响应

    1 2 3 4 我有四个向左浮动的 DIV 上图 使用简单的 CSS float left 宽度 128 像素 高度 128 像素 当我缩小屏幕时 最后一个 DIV 正确跳到下一行 1 2 3 4 但我真正想要的是最后两个块跳到下一行 以保
  • 将数据集导出到 Excel 2007 EPPlus

    我正在尝试将数据集导出到 excel 2007 我无法使用用于在内容类型中使用 mime 类型导出的正常代码 如下所示 Response ContentType application ms excel 如果我对 xls 使用 mime 类
  • 将时间分成间隔

    我有三个输入 开始时间 End time 间隔时间 Example start time 01 00 end time 01 30 intervel time 10 min 我需要像 01 00 01 10 01 20 01 30 这样的输
  • 如何在单个查询中更改所有表前缀

    我对 mysql 非常业余 你能告诉我如何在单个查询中更改整个数据库的表前缀 我可以手动执行此操作 但更改所有表前缀非常耗时 请帮帮我 就像 isc administrator log 到 cus administrator log 意味着
  • 发出局部变量并为其赋值

    我正在初始化一个整数变量 如下所示 LocalBuilder a ilGen DeclareLocal typeof Int32 我如何访问它并为其赋值 我想做这样的事情 int a b a 5 b 6 return a b Use the
  • 在 Python 中进行自动属性分配的最佳方法是什么?这是一个好主意吗?

    而不是每次定义类时都编写这样的代码 class Foo object def init self a b c d e f g self a a self b b self c c self d d self e e self f f sel