Su tarea es escribir algún código en Python 2 o 3 de modo que esta expresión:
(a+b)(c+d) == a*c + b*c + a*d + b*d
evaluará a True
sin plantear ninguna excepción.
Para aclarar, copiaré su código en un archivo, luego from
el archivo import *
. Luego escribiré la expresión en la consola y verificaré que sea así True
.
Este es el código de golf, por lo que gana la respuesta con la longitud más corta (en bytes).
0 .__mul__
paralambda y:0
pero es de la misma longitud.x.count
Guarda un byte.type(t(), t())
ot().type(t())
lanza una excepción, entonces, ¿qué sucede cuando lo hacest() + t()
?__add__
se llama con dos, pero el primero se interpreta comoself
, soloother
se pasa atype
. Raro si.a + b
primeros intentosa.__add__(b)
.a.__add__
es decirtype
, eso se conviertetype(b)
. La diferencia clave entre este caso y el caso habitual de los métodos es que, pora.__add__
lo general, sería un objeto diferente del que se estableció__add__
en la definición de clase, debido al protocolo descriptor , que implementan los objetos de función ordinarios. (También hay algunas otras partes difíciles que no son relevantes aquí.)54 bytes
Hacer un objeto que herede de
int
, excepto que agregar o llamar solo devuelve una copia de sí mismo.Mismo largo:
Pensé
min
o{}.get
funcionaría en lugar delambda a,b:a
, pero por alguna razón actúan solo en el segundo argumento.fuente
min
ya tiene un__self__
atributo, por lo que la clase omite vincularse a sí misma. Por quémin
tiene__self__
otra pregunta ...min
tiene un__self__
.min.__self__
es solo un artefacto de cómo se implementan las funciones integradas y los métodos integrados como el mismo tipo.min
no funciona aquí porque, a diferencia de las funciones escritas en Python, las funciones integradas no admiten el protocolo descriptor, que es responsable de vincular el primer argumento.8166 bytesfuente
68 bytes
Si bien no puede competir realmente con las respuestas existentes, esta realmente realiza el cálculo en cuestión:
Explicación:
sympy.abc
contiene todos los símbolos de una sola letra, en las particulares nombradosa
,b
,c
, yd
.a+b
es unAdd
objeto, que representa una suma general.type(a+b).__call__= […]
monkey parchea laAdd
clase para darle capacidades de evaluación, en este caso permitiéndole funcionar como una multiplicación de quien llama y quien llama.expand
es necesario para que las expresiones sean realmente iguales (ya que SymPy solo realiza comprobaciones de igualdad exhaustivas bajo demanda).fuente