Рубрики
Без рубрики

Generadores y ссылки

Generadores y ссылки LAS Referencias En Python Son un Tema Que a Menudo se pasa por a … Tagged с Python.

LAS SERECTENCIAS EN Python Сон и Тюма Que a Menudo se pasa por alto, incluso por los que ya no somos Tan Novatos Анкет Hagamos un Experimento, Toma A Diez Desarrolladores que conozcas y pregúntales Qué hay de malo en esta función.

def funcionx(*args):
    ctx = dict()
    for x in args:
        ctx['run'] = x
        yield ctx

Vale, Es una pregunta con truco y la respuesta es делать o Нада EN DEPENCEIA DE COMO UTILICES LA Función Generadora. Si no sabes que es una función generadora porque no имеет llegado ese capítulo en El Libro o ни у тей есть Лейдо la PEP 255 Нет импорта. Aquí tienes la ersión TL; DR

Los Funciones Generadoras Son Aquellas que usan урожай en Vez de возврат Пара Деволвер Валорес.

Cuando llamas una función generadora pateienes un генерадор , El CualESELES UTILIZAR PARA SEGUIR OBTENIENDO VALORSE DE LA FUNCION, HACIENDO LLAMADAS QUE RETORNARAN NUEVOS VALORES MITERAS ENCUENTREN урожай (Como dije antes tl; dr o mejor Tl; dw ) Los Generadores Son Ierables Así que vembente se utilizan en ciclos для .. в Анкет

>>> funcionx(1,2,3,4)

>>> for x in funcionx(1,2,3,4):
.... print(x)
{'run': 1}
{'run': 2}
{'run': 3}
{'run': 4}

Hasta aquí parece todo bien, Funcionx RETORNA UN OBJETO DE TIPO GENESADOR Y PODEMOS ITERAR SOBRE LOS RESSUTADOS. Pero por alguna razón no pasa esta sencilla prueba untaria.

class TestFuncionx(unittest.TestCase):

    def test_returns_generator(self):
        self.assertTrue(isinstance(funcionx(1,2,3,4),collections.Iterable))

    def test_yields_context(self):
        l = list(funcionx(1,2))
        self.assertEqual(len(l),2)
        # ¡¡Fatal!!
        self.assertEqual(l,[{'run': 1}, {'run': 2}])

¿ Cómo es Постановка? Oversiamente algo está faldando en la prueba untaria, verifiquemos manualmente.

>>> len(list(funcionx(1,2,))) == 2
True
>>> list(funcionx(1,2,))
[{'run': 2}, {'run': 2}]

Ммммм … ¿Qúe? … мммм. Calma, miremos de cerca la función, Especialmente la parte en que hace:

yield ctx

¿Recuerdas Que ctx es un diccionario? ¿ Recuerdas que los diccionarios en Python Сын ссылки?

En cada ejecución del generador estamos devolviendo la MISMA Ссылка Con Valores Modificados. Cuando utilizas la función en El Ciclo для… в utilizamos el Valor de ctx y lo decpartamos enseguida, como no Guardamos el resultado no notamos que el elaximo valor que obtenemos es la misma serirecia modificada.

La Prueba Unitaria Falla Porque, Cada Invocación del generador modifica las serirecias que tenemos guardadas.

En Este caso overendremos una lista de n Elementos que tienen el último Valor de ctx Анкет

Por Suerte el Проблема Tiene Soluciones Sencillas, Podemos retornar una nueva instancia en Cada Invocación o Smailyemente Crear una Copia:

def funcionx(*args):
    ctx = dict()
    for x in args:
        ctx['run'] = x
        yield dict(ctx)

Y Listo, нет Más Valors Extraños ni pruebas Que Fallan.

Оригинал: “https://dev.to/yorodm/generadores-y-referencias-14p3”