Articles of monkeypatching

Función privada del parche de mono python

Tengo un módulo con una función (llámalo a() ) que llama a otra función definida en el mismo módulo (llámalo __b() ). __b() es una función que habla a un sitio web a través de urllib2 y recupera algunos datos. Ahora estoy tratando de probar a() , pero, por supuesto, preferiría que mis pruebas unitarias […]

¿Cómo monkeypatch un método estático?

Si bien es bastante simple crear métodos de instancia de monkeypatch a clases, por ejemplo class A(object): pass def a(self): print “a” Aa = a haciendo esto con el @staticmethod à la de otra clase class B(object): @staticmethod def b(): print “static b” Ab = Bb resultados en Ab() dando un TypeError : el método […]

Cómo ejecutar código arbitrario después de que Django esté “cargado completamente”

Necesito realizar algunas tareas bastante simples después de que mi entorno Django se haya “cargado completamente”. Más específicamente, necesito hacer cosas como Signal.disconnect() algunas señales de Django que están configuradas por mi biblioteca de terceros de forma predeterminada y connect mis propias señales y debo hacer algunos “parches de mono” para agregar funciones de conveniencia […]

Rastreando conversiones implícitas de Unicode en Python 2

Tengo un gran proyecto donde en varios lugares se utilizaron conversiones (coersiones) implícitas problemáticas y problemáticas, por ejemplo: someDynamicStr = “bar” # could come from various sources # works u”foo” + someDynamicStr u”foo{}”.format(someDynamicStr) someDynamicStr = “\xff” # uh-oh # raises UnicodeDecodeError u”foo” + someDynamicStr u”foo{}”.format(someDynamicStr) (Posiblemente otras formas también.) Ahora me gustaría rastrear esos usos, […]

Ponche de pato en una propiedad en python

Me gustaría poder agregar una propiedad http://docs.python.org/library/functions.html#property a un objeto (una instancia específica de una clase). es posible? Algunas otras preguntas sobre la perforación de patos / parches de monos en python: Adición de un método a una instancia de objeto existente Python: cambio de métodos y atributos en tiempo de ejecución ACTUALIZACIÓN: Respondida por […]

¿Por qué el monkeypatch de Python no funciona al importar una clase en lugar de un módulo?

Estaba teniendo problemas al usar el código de la respuesta aceptada aquí . El código funciona dependiendo de cómo hago la importación de datetime. ¿Porqué es eso? ¿Es posible burlarse de él para que funcione en ambos sentidos? Estoy usando Python 3.4 . El siguiente código ilustra el problema: import pytest from datetime import datetime […]

Python: cómo combinar el método de clase de parche a otro método de clase

Tengo el siguiente código: class A: def __init__(self): self.a = “This is mine, ” def testfunc(self, arg1): print self.a + arg1 class B: def __init__(self): self.b = “I didn’t think so” self.oldtestfunc = A.testfunc A.testfunc = self.testfuncPatch def testfuncPatch(self, arg): newarg = arg + self.b # B instance ‘self’ self.oldtestfunc(self, newarg) # A instance ‘self’ […]

Si se permiten parches de mono tanto en Ruby como en Python, ¿por qué es más controvertido en Ruby?

En muchas de las discusiones que he escuchado sobre Ruby, en las que las personas expresson sus reservas sobre el idioma, el tema del parche de los monos se presenta como una de sus principales preocupaciones. Sin embargo, rara vez escucho los mismos argumentos en el contexto de Python, aunque también está permitido en el […]

pymongo + gevent: tirame un plátano y solo monkey_patch?

Rápido aquí, que necesita más experiencia en el dominio de pymongo del que tengo ahora: ¿Las partes “correctas” del controlador de pymongo están escritas en python para que yo las llame a gevent monkey_patch () y altere con éxito el comportamiento de locking de pymongo en r / w dentro de los greenlets “asíncronos” de […]

Mono parcheando una propiedad @

¿Es posible parchear el valor de una @property de una instancia de una clase que no controlo? class Foo: @property def bar(self): return here().be[‘dragons’] f = Foo() print(f.bar) # baz f.bar = 42 # MAGIC! print(f.bar) # 42 Obviamente, lo anterior produciría un error al intentar asignar a f.bar . Es # MAGIC! posible de […]