标签: monkeypatching

如果Ruby和Python都允许猴子修补,为什么在Ruby中更具争议性呢?

在许多讨论中,我听说过人们对语言有所保留的Ruby,猴子修补问题成为他们主要关注的问题之一.

但是,我很少听到在Python上下文中提出的相同论点,尽管在Python语言中也允许这样做.

为什么这个区别?

Python是否包含不同类型的安全措施以最大限度地降低此功能的风险?

ruby python language-features monkeypatching

15
推荐指数
4
解决办法
2470
查看次数

在不更改原始Django App的情况下向Django FlatPages添加功能

我想在Django FlatPage数据库模型中添加一个字段,但我真的不知道如何在不编辑原始应用程序的情况下扩展它.

我想要做的是将以下字段添加到模型:


from django.db import models
from django.contrib.flatpages.models import FlatPage as FlatPageOld

class FlatPage(FlatPageOld):
    order = models.PositiveIntegerField(unique=True)
Run Code Online (Sandbox Code Playgroud)

如何将其添加到FlatPage模型?

提前致谢

django monkeypatching django-models

14
推荐指数
2
解决办法
7497
查看次数

在Python打印中添加日期时间戳

我正在尝试调试我依赖的大型库的行为,它通过其许多源文件使用散布(没有过多的)调试打印语句.麻烦的是,大多数(如果不是全部)这些调试打印语句都不包含日期/时间戳,因此很难将应用程序级别的故障与库代码本身内的故障相关联.

而不是修改怀疑涉及我所看到的故障的所有调试打印的源代码,我认为有可能暂时修补内置的Python打印"功能",以便所有输出都带有前缀时间戳.

由于内置打印不是我正在使用的Python 2.6环境中的函数,我不知道这是否可行.如果有人这样做或使用另一个钩子进入Python获得了类似的结果,那么我将非常感谢你的建议,甚至更好的解决这个问题的代码.

python debugging monkeypatching built-in

14
推荐指数
2
解决办法
7729
查看次数

猴子补丁vs class_eval?

class String
  def hello
    "world"
  end
end

String.class_eval {
  def world
    "hello"
  end
}

"a".world
=> "hello"
"b".hello
=> "world"
Run Code Online (Sandbox Code Playgroud)

他们似乎做了同样的事情 - 向现有类添加方法.那有什么区别?

ruby monkeypatching metaprogramming

14
推荐指数
2
解决办法
1952
查看次数

如何将类型提示添加到现有模块类的猴子修补函数中?

我想知道如何将类型提示(用于 PyCharm IDE 代码完成支持)添加到def links(self) -> List[str]我通过猴子修补到现有模块的类的方法:

我的功能

def issue_links(self) -> List[str]:
    links = []
    # ...
    return links
Run Code Online (Sandbox Code Playgroud)

将函数猴子修补到Issuepython-jira 类

from jira.resources import Issue

# {...} my defined function code is somewhere here

Issue.links = issue_links
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是,当我在Issue对象上调用该方法时,PyCharm 显然无法识别该方法。我尝试遵循PEP 484 存根文件并使用文件typing中的模块.pyi来让 IDE 找到我的猴子修补函数的定义。

问题.pyi

from typing import List

class Issue:
    def links(self) -> List[str]: ...
Run Code Online (Sandbox Code Playgroud)

然而,这是行不通的。我的假设是文件结构在某种程度上不正确:

文件位置

jira-python module>> 站点包(使用pip install jira)下载

myFile.py …

python monkeypatching type-hinting pycharm pyi

14
推荐指数
1
解决办法
2484
查看次数

pymongo + gevent:给我一个香蕉,只是monkey_patch?

在这里需要更多关于pymongo的领域专业知识比我现在快:

用python编写的pymongo驱动程序的"正确"部分是否可以调用gevent monkey_patch()并在gevent"异步"greenlets中成功改变pymongo在r/w上的阻塞行为?

如果这需要更多关于gevent和pymongo的腿部工作 - 但这是可行的 - 只要我能得到一点关于irc的指导,我就会非常愿意投入时间.

谢谢!

注意:在小规模mongo写入不是一个大问题,因为我们只是在解锁前排队写入"请求".但是与fiorix谈论他的扭曲异步mongo驱动程序(https://github.com/fiorix/mongo-async-python-driver),即使是mongo的快速写入(请求)也会导致大规模异步应用程序出现问题.(当然,非阻塞读取可能会从一开始就引起问题!)

python monkeypatching mongodb pymongo gevent

13
推荐指数
1
解决办法
4012
查看次数

扩展类(Monkey Patching)如何在Python中工作?

class Foo(object):
  pass

foo = Foo()
def bar(self):
  print 'bar'

Foo.bar = bar
foo.bar() #bar
Run Code Online (Sandbox Code Playgroud)

来自JavaScript,如果"类"原型增加了某个属性.众所周知,该"类"的所有实例在其原型链中都具有该属性,因此不必对其任何实例或"子类"进行修改.

从这个意义上说,像Python这样的基于类的语言如何实现Monkey补丁?

python oop monkeypatching object

12
推荐指数
2
解决办法
1100
查看次数

如何猴子补丁Django?

我发现这篇关于猴子修补Django的帖子:

from django.contrib.auth.models import User

User.add_to_class('openid', models.CharField(max_length=250,blank=True))

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)
Run Code Online (Sandbox Code Playgroud)

我知道这并不理想,最好User通过单独的模型添加字段和函数Profile.

话虽如此,我只是想了解这是如何工作的:

  1. 我会把猴子修补代码放在哪里?

  2. 代码何时运行 - 只需一次?每个Python解释器启动一次?每次请求一次?

  3. 据推测,我仍然需要更改数据库架构.所以,如果我放弃桌子User并跑了./manage.py syncdb,会syncdb"知道"已经添加了一个新字段User吗?如果不是,我如何更改架构?

python django monkeypatching django-models

12
推荐指数
2
解决办法
1万
查看次数

猴子修补XMLHttpRequest.prototype.open和"触摸"参数

我正在尝试为XMLHttpRequest.prototype.open在IE8兼容模式下运行的Intranet站点添加补丁程序,但它一直在投掷SCRIPT438: Object doesn't support this property or method.奇怪的是......如果我"触摸"第arguments一个,即取消注释bar,它就可以正常工作!有谁知道为什么,如果触摸它确实解决了100%的情况下的问题?

var foo = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function() {
  //var bar = arguments;
  foo.apply(this, arguments);
  console.log("OK");
}
Run Code Online (Sandbox Code Playgroud)

这是在IE8模式中的IE9现代.用VM图像搜索的VM截图试图open在滚动时修补猴子的请求.

在此输入图像描述

编辑:

console.log(foo);
//console.log(foo.apply);
console.log(typeof foo);
console.log(foo instanceof Function);
Run Code Online (Sandbox Code Playgroud)

返回

LOG: 
function open() {
    [native code]
}

LOG: object 
LOG: false  
Run Code Online (Sandbox Code Playgroud)

console.log(foo.apply)一个抛出"Object doesn't support this property or method".

有趣的是,我无法在我试过的任何模式下在实际的IE8虚拟机中复制这个,只能在运行IE8标准模式的IE9中.

javascript internet-explorer monkeypatching xmlhttprequest

12
推荐指数
1
解决办法
1390
查看次数

有没有办法从类外部修改Java中的`private static final`字段的值?

我知道这通常是相当愚蠢的,但在阅读这个问题之前不要开枪.我保证我有充分的理由需要这样做:)

可以使用反射修改java中的常规私有字段,但是在尝试对final字段执行相同操作时,Java会引发安全性异常.

我认为这是严格执行的,但无论如何我都会问,以防万一有人想出一个黑客来做这件事.

我只想说我有一个带有" SomeClass" 类的外部库

public class SomeClass 
{
  private static final SomeClass INSTANCE = new SomeClass()

  public static SomeClass getInstance(){ 
      return INSTANCE; 
  }

  public Object doSomething(){
    // Do some stuff here 
  }
} 
Run Code Online (Sandbox Code Playgroud)

我基本上想要Monkey-Patch SomeClass,以便我可以执行我自己的版本doSomething().由于没有(据我所知)在java中真正做到这一点的任何方法,我在这里唯一的解决方案是改变它的值,INSTANCE因此它返回我修改后的方法的类版本.

基本上我只想用安全检查包装调用,然后调用原始方法.

外部库总是getInstance()用来获取这个类的实例(即它是一个单例).

编辑:只是澄清,getInstance()由外部库调用,而不是我的代码,所以只是子类化不会解决问题.

如果我不能这样做,我能想到的唯一其他解决方案是复制粘贴整个类并修改方法.这并不理想,因为我必须更新库以更新库.如果某人有更多可维护的东西,我愿意接受建议.

java monkeypatching

11
推荐指数
2
解决办法
3159
查看次数