在Rails中向整数类添加方法的最佳位置在哪里?我想添加一个to_meters和to_miles方法.
我希望能够将属性http://docs.python.org/library/functions.html#property添加到对象(类的特定实例).这可能吗?
关于python中鸭子打孔/猴子修补的其他一些问题:
更新:由delnan在评论中回答
我在调用从另一个模块导入的另一个方法的模块中有以下方法:
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)
问题是,如何在测试时修补模块的方法,以便在测试阶段不会调用它?
我正在制作带插件的django网站.每个插件都是一个简单的django应用程序,取决于主要的(或甚至其他插件).
虽然应用程序/插件之间的依赖关系对我来说很清楚,但是通过猴子修补添加列(作为插件特定模型的外键)应该是可以接受的,以避免主应用依赖于插件.
由于主应用程序已经具有南方管理功能,因此具有所有插件,因此我无法在这些模块的设置中更改迁移目录.
那么,我如何从其他南方应用程序中修补南方应用程序模型?
ps:我是法国人,如果你发现任何错误,可以随意纠正我的问题,或者如果我不清楚的话,可以随便提问.
编辑:我在django迁移中添加了关于我现在如何做的答案.
鉴于一类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)
所以,
奇怪的是,这在Python3中不再失败......
我有一个无法修改的jar文件,但我想使用一个不同的.class文件代替jar的其中一个成员.当jar中的代码尝试加载它时,如何告诉Java使用外部.class文件?
寻找一种方法如何将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) 目前,我正在编写一些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) 请考虑以下代码:
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中包装/猴子补丁模块.我正在尝试开发一种干净的实现方法,不会干扰任何现有的代码.
给出一个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)
这基本上是猴子修补模块,就像猴子补丁类,函数和方法一样.我相信如果这样做是正确的,那么可以用项目特定的方式一致地修补代码.
实现这个的最佳方法是什么?
monkeypatching ×10
python ×8
django ×2
django-admin ×1
django-south ×1
jar ×1
java ×1
properties ×1
pytest ×1
python-2.x ×1
ruby ×1
unit-testing ×1