Articles of python internals

Usando una función definida en una cadena ejecutada en Python 3

¿Por qué el siguiente código de python3 produce un error? a=”’ def x(): print(42) ”’ class Test: def __init__(self): exec(a) x() t = Test() Resultados en este mensaje: Traceback (most recent call last): File “bug.py”, line 11, in t = Test() File “bug.py”, line 9, in __init__ x() NameError: global name ‘x’ is not defined

¿Cómo obtener el recuento de referencia de un PyObject?

¿Cómo obtener el recuento de referencia de un PyObject desde C ++? Hay funciones Py_INCREF y Py_DECREF que lo aumentan / disminuyen, pero no he encontrado ninguna función que devuelva el recuento de referencias del objeto. Lo necesito para fines de depuración.

RuntimeError: sys.stdout perdido

Estaba intentando depurar un problema con abc.ABCMeta , en particular una verificación de subclases que no funcionó como se esperaba y quería comenzar simplemente agregando una print al método __subclasscheck__ (Sé que hay mejores formas de depurar el código, pero pretender por el bien de esta pregunta que no hay alternativa). Sin embargo, al iniciar […]

Python es el comportamiento del operador con una cadena

No puedo entender el siguiente comportamiento. Estoy creando 2 cadenas, y estoy usando el operador para compararlo. En el primer caso, está funcionando de manera diferente. En el segundo caso, funciona como se esperaba. ¿Cuál es la razón cuando uso una coma o un espacio, muestra False al compararlo con, y cuando no se usa […]

¿Cuál es la diferencia entre una tupla invertida y una lista invertida?

Invertir una tupla y revertir una lista devuelve objetos de diferente tipo: >>> reversed((1,2)) >>> reversed([1,2]) Tienen la misma dir . Ningún tipo es una subclase de la otra. ¿Porqué es eso? ¿Qué puede uno hacer que el otro no puede?

¿Por qué Python maneja ‘1 es 1 ** 2’ de manera diferente a ‘1000 es 10 ** 3’?

Inspirado por esta pregunta sobre el almacenamiento en caché de enteros y cadenas pequeños, descubrí el siguiente comportamiento que no entiendo. >>> 1000 is 10**3 False Pensé que entendía este comportamiento: 1000 es demasiado grande para ser almacenado en caché. 1000 y 10 ** 3 puntos a 2 objetos diferentes. Pero me equivoqué: >>> 1000 […]

¿Cuál es la diferencia entre una ‘función’, un ‘método’ y un ‘método enlazado’ en Python 3?

He observado al menos 3 tipos relacionados con funciones en Python 3: >>> class A(): … def f(): pass … >>> Af >>> A().f <bound method Af of >> set.union Me pregunto cuál es la diferencia entre ‘función’, ‘método’ y ‘método enlazado’? ¿Es ‘método’ un tipo equivalente a ‘método no vinculado’ en Python 2?

¿Por qué la función ‘len’ de Python es más rápida que el método __len__?

En Python, len es una función para obtener la longitud de una colección llamando al método __len__ un objeto: def len(x): return x.__len__() Así que esperaría que la llamada directa de __len__() fuera al menos tan rápida como len() . import timeit setup = ”’ ”’ print (timeit.Timer(‘a=”12345″; x=a.__len__()’, setup=setup).repeat(10)) print (timeit.Timer(‘a=”12345″; x=len(a)’, setup=setup).repeat(10)) Enlace […]

¿Por qué la asignación de sectores es más rápida que `list.insert`?

Inspirado por esta buena respuesta , Aquí hay un punto de referencia: import timeit def test1(): a = [1,2,3] a.insert(0,1) def test2(): a = [1,2,3] a[0:0]=[1] print (timeit.timeit(‘test1()’,’from __main__ import test1′)) print (timeit.timeit(‘test2()’,’from __main__ import test2′)) Para mí, test2 es un poco más rápido (~ 10%). ¿Por qué es ese el caso? Espero que sea […]

¿Qué es el protocolo de secuencia de Python?

Python hace mucho con métodos mágicos y la mayoría de estos son parte de algún protocolo. Estoy familiarizado con el “protocolo iterador” y el “protocolo numérico”, pero recientemente tropecé con el término “protocolo de secuencia” . Pero incluso después de algunas investigaciones no estoy exactamente seguro de cuál es el “protocolo de secuencia”. Por ejemplo, […]