标签: monkeypatching

在Rails中向Integer类添加方法的最佳位置在哪里?

在Rails中向整数类添加方法的最佳位置在哪里?我想添加一个to_metersto_miles方法.

ruby monkeypatching ruby-on-rails

5
推荐指数
1
解决办法
4054
查看次数

猛击在Python的物产的鸭子

我希望能够将属性http://docs.python.org/library/functions.html#property添加到对象(类的特定实例).这可能吗?

关于python中鸭子打孔/猴子修补的其他一些问题:

将方法添加到现有对象实例

Python:在运行时更改方法和属性

更新:由delnan在评论中回答

在python中动态添加@property

python monkeypatching properties

5
推荐指数
1
解决办法
2780
查看次数

Monkey在模块中修补功能以进行单元测试

我在调用从另一个模块导入的另一个方法的模块中有以下方法:

def imported_function():
    do_unnecessary_things_for_unittest()
Run Code Online (Sandbox Code Playgroud)

需要测试的实际方法,导入并使用上述功能:

from somewhere import imported_function

def function_to_be_tested():
    imported_function()
    do_something_more()
    return 42
Run Code Online (Sandbox Code Playgroud)

内部呼叫和内部相关计算imported_function并不重要,他们是不是我想要测试,所以我只是想跳过他们,而测试的实际功能是什么function_to_be_tested.

因此,我试图在测试方法内部的某个地方修补模块,但没有运气.

def test_function_to_be_tested(self):
    import somewhere
    somewhere.__dict__['imported_function'] = lambda : True
Run Code Online (Sandbox Code Playgroud)

问题是,如何在测试时修补模块的方法,以便在测试阶段不会调用它?

python unit-testing monkeypatching

5
推荐指数
2
解决办法
9585
查看次数

如何从插件中修补南方处理的模型?

我正在制作带插件的django网站.每个插件都是一个简单的django应用程序,取决于主要的(或甚至其他插件).

虽然应用程序/插件之间的依赖关系对我来说很清楚,但是通过猴子修补添加列(作为插件特定模型的外键)应该是可以接受的,以避免主应用依赖于插件.

由于主应用程序已经具有南方管理功能,因此具有所有插件,因此我无法在这些模块的设置中更改迁移目录.

那么,我如何从其他南方应用程序中修补南方应用程序模型?

ps:我是法国人,如果你发现任何错误,可以随意纠正我的问题,或者如果我不清楚的话,可以随便提问.

编辑:我在django迁移中添加了关于我现在如何做的答案.

python django monkeypatching django-south django-migrations

5
推荐指数
1
解决办法
407
查看次数

如何将一个类的实例方法monkeypatch到另一个类?

鉴于一类A我只是可以添加一个instancemethod a通过

def a(self):
    pass

A.a = a
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试添加另一个类B的instancemethod b,即A.b = B.b调用的尝试A().b()产生一个

TypeError:b()必须使用B实例作为第一个参数调用unbound方法(没有任何东西)

(虽然B().b()很好).确实存在差异

A.a -> <unbound method A.a>
A.b -> <unbound method B.b>  # should be A.b, not B.b
Run Code Online (Sandbox Code Playgroud)

所以,

  • 如何解决这个问题?
  • 为什么会这样?它似乎不直观,但通常Guido有一些很好的理由......

奇怪的是,这在Python3中不再失败......

python monkeypatching python-2.x instance-methods

5
推荐指数
1
解决办法
586
查看次数

如何在jar中monkeypatch .class文件

我有一个无法修改的jar文件,但我想使用一个不同的.class文件代替jar的其中一个成员.当jar中的代码尝试加载它时,如何告诉Java使用外部.class文件?

java monkeypatching jar

5
推荐指数
1
解决办法
505
查看次数

管理员中其他app标签下的Django模型?

寻找一种方法如何将ModelAdmin实例分配给不同的默认应用程序标签,即使在最新的Django 1.8中也是如此.

Django项目架构:

<root>/appone/models.py    # class ModelOne(django.db.models.Model)
<root>/appone/admin.py     # class ModelOneAdmin(
                           #     django.contrib.admin.ModelAdmin)
                           # admin.site.register(
                           #     ModelOne, ModelOneAdmin)

<root>/apptwo/models.py    # class ModelTwo(django.db.models.Model)
<root>/apptwo/admin.py     # class ModelTwoAdmin(
                           #     django.contrib.admin.ModelAdmin)
                           # admin.site.register(
                           #     ModelTwo, ModelTwoAdmin)
Run Code Online (Sandbox Code Playgroud)

通过上面的示例,每个模型都显示在由应用程序名称标记的单独组中的管理界面中.

  --- appone
        |
        +--- ModelOne

  --- apptwo
        |
        +--- ModelTwo
Run Code Online (Sandbox Code Playgroud)

如何告诉Django ModelTwo下发生的appone标签?(不改变appone应用程序源及其模型!)

  --- appone
        |
        +--- ModelOne
        |
        +--- ModelTwo

  --- apptwo
        <empty>
Run Code Online (Sandbox Code Playgroud)

python django monkeypatching django-models django-admin

5
推荐指数
2
解决办法
2604
查看次数

使用os.environ的pytest模块-如何正确测试?

目前,我正在编写一些Webapp,但是这次我想学习如何为它编写适当的测试(使用pytest):)

我经常看到的一种非常常见的模式是使用环境变量来更改默认配置。目前,我正在努力进行正确的测试。

我准备了一些演示:

./app
./app/conf.py
./conftest.py
./run.py
./tests
./tests/test_demo.py
Run Code Online (Sandbox Code Playgroud)

我的./app/conf.py样子是这样的:

from os import environ

DEMO = environ.get('DEMO', 'demo')
TEST = environ.get('TEST', 'test')
Run Code Online (Sandbox Code Playgroud)

通过启动./run.py显示设置确实可以更改:

from os import environ

environ['DEMO'] = 'not a demo'
environ['TEST'] = 'untested'

from app import conf

if __name__ == '__main__':

    print(conf.DEMO)
    print(conf.TEST)
Run Code Online (Sandbox Code Playgroud)

它打印出来not a demo,并untested-如预期。大。(请注意,我在导入之前设置了环境变量conf)。

现在进行测试:./conftest.py当前为空,它仅有助于pytest在app文件夹中定位模块。

./tests/test_demo.py包含以下内容:

def test_conf_defaults():
    from app import conf

    assert conf.DEMO == 'demo'
    assert conf.TEST == 'test'


def test_conf_changed(monkeypatch): …
Run Code Online (Sandbox Code Playgroud)

python monkeypatching environment-variables pytest

5
推荐指数
1
解决办法
5517
查看次数

将属性添加到python类

请考虑以下代码:

class Foo():

    pass


Foo.entries = dict()


a = Foo()
a.entries['1'] = 1

b = Foo()
b.entries['3'] = 3

print(a.entries)
Run Code Online (Sandbox Code Playgroud)

这将打印:

{'1': 1, '3': 3}
Run Code Online (Sandbox Code Playgroud)

因为条目是作为静态属性添加的.有没有办法猴子修补类定义以添加新属性(不使用继承).

我设法找到了以下方式,但它看起来很复杂:

def patch_me(target, field, value):
    def func(self):
        if not hasattr(self, '__' + field):
            setattr(self, '__' + field, value())
        return getattr(self, '__' + field)
    setattr(target, field, property(func))

patch_me(Foo, 'entries', dict)
Run Code Online (Sandbox Code Playgroud)

python monkeypatching

5
推荐指数
1
解决办法
723
查看次数

Python Overlays:猴子补丁的一个案例

我试图在python中包装/猴子补丁模块.我正在尝试开发一种干净的实现方法,不会干扰任何现有的代码.

问题

给出一个CLASS从a 导入一些的脚本MODULE

from MODULE import CLASS 
Run Code Online (Sandbox Code Playgroud)

我想换MODULE另一个_MODULE_._MODULE_原始补丁在哪里MODULE?我能看到的最干净的界面如下.

from overlay import MODULE # Switches MODULE for _MODULE
from MODULE import CLASS   # Original import now uses _MODULE_
Run Code Online (Sandbox Code Playgroud)

这基本上是猴子修补模块,就像猴子补丁类,函数和方法一样.我相信如果这样做是正确的,那么可以用项目特定的方式一致地修补代码.

实现这个的最佳方法是什么?

python monkeypatching python-import

5
推荐指数
1
解决办法
295
查看次数