IIC2233 / Syllabus-2018-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉 🎊
30 stars 73 forks source link

variables de modulo? #338

Closed naquiroz closed 6 years ago

naquiroz commented 6 years ago

Digamos tengo un modulo que tiene funciones que usan un archivo constantemente. Puedo guardar de manera global como string, ese archivo :page_withcurl:? Pregunto, por la filosofía de “Do one thing and do it well”_, dado que se busca hacer funciones de lineas <= 15, entonces se podría considerar como trampa ❌

rihanuch commented 6 years ago

¡Hola @naquiroz !

Cuando dices:

guardar de manera global como string, ese archivo 📃

¿A qué te refieres con eso? (De lo posible dar un ejemplo) 🤔

naquiroz commented 6 years ago

Hola @rihanuch !

Con eso me refiero a lo siguiente:

with open('something.txt', encoding='utf-8') as file:
    the_file = file.read().splitlines()

def is_in_file(word: str) -> bool:
    for line in the_file:
        if word in line:
            return True
    return False

def edit_line(initial: str, final: str):
    for i, line in enumerate(the_file):
        if line == initial:
            the_file[i] = final
            break

Edit

Otro ejemplo seria hacer uso de namedTuples:

from collections import namedtuple
from typing import Tuple

Data = namedtuple('Data', ('id_', 'data'))

def make_somethinng(id_: int, string: str) -> Data:
    return Data(id_, string)

def get_something(data: Data) -> Tuple[int, str]:
    return data.id_, data.data

Como se puede ver en los ejemplos, existe una variable que se usa a lo largo de varias funciones, y pero técnicamente no está en ninguna función. Esto está permitido?

rihanuch commented 6 years ago

@naquiroz , se puede hacer lo que dices, siempre y cuando se siga lo siguiente ⚠️:

  1. Hacerlo la menor cantidad de veces posible, porque no en general es muy mala práctica
  2. Declarar que son constantes de manera adecuada, esto implica seguir PEP8, de la forma NOMBRE_CONSTANTE = data 👀
  3. Mantener en mente que la idea de esas constantes es no modificarlas, ya que el propósito es que sean constantes (tal como indica su nombre)

Supongo que no lo hiciste de adrede, pero también es importante mencionar que en tus ejemplos estas haciendo uso indebido 🚨 de los for, ya que en ambos casos se pueden realizar las mismas funciones mediante un map

¡Saludos y éxito! 🍀

naquiroz commented 6 years ago

@rihanuch Gracias! Respecto a

  1. Que pasa si la cosntante es una named tuple? Igual el nombre debe ser en mayusculas?
rihanuch commented 6 years ago

@naquiroz ,

Según la guía de estilo de PEP8, las named tuples deben ser tratadas como clases, por lo tanto solo la primera letra es en mayúsculas. Esto se debe a que:

Class names should normally use the CapWords convention. The naming convention for functions may be used instead in cases where the interface is documented and used primarily as a callable. Note that there is a separate convention for builtin names: most builtin names are single words (or two words run together), with the CapWords convention used only for exception names and builtin constants.

Ojo que tienes que tener en consideración que en la vida real no debes ❌ guardar toda la información que está siendo utilizada en la memoria RAM, ya que de ser así tendrías que tener mucha más de la que se puede tener (por ejemplo si trabajas con una base de datos de índices económicos)

¡Suerte! 🍀

rihanuch commented 6 years ago

@naquiroz , no se si lo alcanzaste a leer antes del EDIT, pero me había equivocado, ahora está bien 😬