IIC2233 / syllabus-2020-2

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉🎊
https://iic2233.github.io
7 stars 57 forks source link

Librerías permitidas, no permitidas y malas prácticas T01 #326

Closed gatochico closed 4 years ago

gatochico commented 4 years ago

Para consultar sobre una librería deben responder esta issue con una pregunta de la siguiente forma:

¿Puedo usar la librería nombre_librería para hacer explicación_de_lo_que_quiero_hacer?

¡Recuerden especificar en su README qué librerías utilizan!


Librerías Permitidas

Librerías Prohibidas

☠️ Built-ins Prohibidos

El uso de alguna de las siguiente funciones es automáticamente un 1,0 sin discusión: 😭

Malas prácticas

El uso de las siguientes prácticas será considerado una mala práctica:

¡Éxito y vamos por la medalla de oro en la tarea 🏅!

yuwet15 commented 4 years ago

Como se puede usar add, se podría usar sub ?

javieraalfarop commented 4 years ago

¿Puedo usar la librería msvcrt para usar msvcrt.getch() en mostrar estado?

tvallotton commented 4 years ago

Podemos usar regex para manejar el padding de espacios en deportistas.csv? Como hay un numero variable de espacios antes de cada coma, usar regex haría as fácil el trabajo de dividir las columnas.

gatochico commented 4 years ago

Hola a todes!

@yuwet15 Sí puedes usar sub.

@javieraalfarop No puedes usar msvcrt ya que no todes les ayudantes tienen windows, y el cambio sería sólo eliminar el tener que presionar Enter.

@tvallotton No puedes usar regex. Sin embargo la inclusión de estos espacios fue error nuestro 😱 se acaba de subir al syllabus una versión sin los espacios para que no tengas que preocuparte de ellos y se enviará un aviso al respecto cuanto antes. Gracias por darte cuenta y disculpa las molestias!

javiermingo commented 4 years ago

Una pregunta, cuales eran la librerías y built ins prohibidos para la T00? que acabo de darme cuenta de que existen penalizaciones por esto

amanda1415 commented 4 years ago

Hola! se puede usar round para redondear los decimales?

sperezmasri commented 4 years ago

Hola, se puede usar setattr?

gatochico commented 4 years ago

Hola!

@javiermingo La issue de librerías prohibidas es #87 .No solo debes leer el post principal, sino también los comentarios donde se preguntan por librerías adicionales.

@amanda1415 round viene por defecto en python así que sí puedes usarlo.

@sperezmasri setattr viene por defecto en python así que sí puedes usarlo.

Éxito a todes!

isidorabecker commented 4 years ago

Hola, a que se refiere que Import* es mala práctica ???

gatochico commented 4 years ago

Hola @isidorabecker !

Import * es considerado mala práctica dentro del curso. Esto es por la siguientes razones (citando los contenidos de la semana 00):

El uso de estas sentencias se considera una mala práctica, ya que importa definiciones sin saber cuantas o cuales son, y potencialmente importa nombres de definiciones que pueden coincidir con nombres de tu programa, sobre-escribiendo definiciones y obteniendo resultados inesperados. Siempre se prefiere tener algún tipo de referencia al módulo de donde proviene una definición, o en su defecto definir, mediante importación parcial, cuáles son aquellas importadas. Esto hace que el código ajeno sea más legible y fácil de entender.

Por lo tanto (y esto cuenta a partir de la T01 en adelante), si usas import * en tu código, se te hará un descuento en la nota de tu tarea, por lo que recomiendo evitarlo.

Saludos y éxito!

aerotecnia99 commented 4 years ago

Hola, se puede usar colorama?

gatochico commented 4 years ago

@aerotecnia99 Sí puedes usar colorama 🎨 . Éxito!

Huasito-Appel commented 4 years ago

Hola! queria saber si podia usar modulos como "pyfiglet" para poder hacer mas facil (y mas choros) los prints, tanto del status como normales. saludos !

fedezang commented 4 years ago

Hola! Quería saber si se puede ocupar continue

gatochico commented 4 years ago

Hola!

@sa-Appel Sí puedes usar pyfiglet en específico. Cualquier otra librería extra que quieras usar debes preguntarla primero por aquí.

@fedezang continue es built-in de python y no es considerado mala práctica, por lo que puedes usarlo.

valerianazal commented 4 years ago

Hola, se puede usar la librería tabulate?

Huasito-Appel commented 4 years ago

hola! creo que Rich puede ser una mejor opción que pyfliget , se puede usar?

mzigm commented 4 years ago

Hola! Cuanto es la penalizacion por usar la libreria csv?

gatochico commented 4 years ago

Hola!

@valerianazal Sí puedes usar tabulate

@sa-Appel Sí puedes usar Rich, pero debes asegurarte que el output de tu tarea se vea correctamente en cualquier sistema operativo :eyes: (Windows, macOS, alguno Linux-based)

@mzigm El descuento por csv son 3 décimas (que no pueden ser eliminadas con el des-descuento de README), y no se dará puntaje en todas las celdas de la distribución que se vean beneficiadas por el uso de esta librería (En este caso, maneja correctamente los archivos csv).

isidorabecker commented 4 years ago

Hola !! puedo hacer from archivo.py import *, es que necesito todos los datos que estan dentro del archivo

tsunayoshi21 commented 4 years ago

Hola, se puede usar exit()

JuanVial1997 commented 4 years ago

cuanto descuentan por usar la libreria numpy?

gatochico commented 4 years ago

Hola! (Feliz viernes)

@isidorabecker No puedes hacer eso, ya que es considerado mala práctica como se indica en la issue original. Debes usar las formas de importación permitidas.

@tsunayoshi21 Sí puedes usar exit()

@JuanVial1997 Numpy es una librería con bastantes usos, por lo que su descuento se evaluará durante la corrección (este puede ir entre 1 y 5 décimas, las cuales no pueden ser eliminadas con el des-descuento de Readme). Además, se darán 0 puntos en cualquier item que esté relacionado con su uso.

denisseleiva commented 4 years ago

Hola! Se puede usar min(a,b) y max(a,b) para el método sanar_lesiones() ?

gatochico commented 4 years ago

Hola @denisseleiva ! Sí puedes usar ambos, ya que son built-ins de python no prohibidos.

pedrobeckerj commented 4 years ago

Puedo usar next para buscar un objeto con cierto atributo en una lista?

gatochico commented 4 years ago

@pedrobeckerj Sí puedes usar next, ya que es un built-in de python

osonodml commented 4 years ago

Si bien import * es mala práctica, resulta tedioso escribir from parametros import PUNTAJE, OTRO_PARAMETRO, ... cuando todos los parámetros se encuentran con nombres descriptivos. ¿Está entonces, permitido realizar el import de la forma import parametros as p ?

gatochico commented 4 years ago

Hola @osonodml ! Sí, import parametros as p es una de las formas válidas de importar funciones/parámetros de otros módulos.

martin-iturralde commented 4 years ago

Hola! Al instanciar una clase, la puedo dejar afuera de las funciones? Es decir, la definiría como una variable global... Sería una mala práctica hacerlo? Ya que, si lo es debería pasar mi clase función en función....

gatochico commented 4 years ago

Hola @martin-iturralde! Sí, en ese caso se estaría haciendo uso de una variable global y sería considerado como mala práctica 😢 . Tu programa debería estar modelado de forma que no sea necesario el uso de este tipo de variables. Éxito! 🏅

denisseleiva commented 4 years ago

@gatochico entonces no se puede instanciar una clase (por ejemplo campeonato) y después pasarla como parámetro a una función (ej menu principal)?

gatochico commented 4 years ago

@denisseleiva Eso sí se puede hacer, siempre y cuando se la pases a la función como un argumento 🤓. Lo que es considerado variable global es instanciarla fuera de todas las funciones con el fin de llamarla dentro de dichas funciones sin tener que dársela como argumento. Algo así:

# Definimos una clase
class Clase:
  def __init__(self):
    self.saludo = "Hello"

  def saludar(self):
    print(self.saludo)

# Se instancia
clase_instanciada = Clase()

# Defino esta función, que no recibe como parámetro la instancia
def funcion():
  # ...pero hago llamado a la instancia igual dentro de ella.
  # Incluso desde dentro de la función le cambio un atributo.
  clase_instanciada.saludo = "Hello world!"
# Ejecuto la función
funcion()
# Y cuando llamo a saludo de nuevo, el saludo ha cambiado :O
clase_instanciada.saludar()

Si ejecuto esto, me retornará: Hello World! y no Hello, por lo que se modificó el atributo de la clase al haber llamado a funcion(). Si embargo nunca le dimos clase_instanciada como argumento a funcion(). Esto es lo considerado mala práctica, ya que en códigos de gran tamaño, como las tareas, esto dificulta la lectura del código. Sin embargo, si a las funciones le pasas la clase como argumento, se puede saber de forma más fácil de donde provienen las clases y variables utilizadas.

Esto sí sería permitido:

# Definimos una clase
class Clase:
  def __init__(self):
    self.saludo = "Hello"

  def saludar(self):
    print(self.saludo)

# Se instancia
clase_instanciada = Clase()

# Ahora si le doy el argumento
def funcion(clase):
  # Le cambio el atributo, pero ya se de donde proviene la variable clase.
  clase.saludo = "Hello world!"
# Ejecuto la función con la clase instanciada como argumento.
funcion(clase_instanciada)
# Y cuando llamo a saludo de nuevo, ha cambiado el valor, pero ya no es tan confuso como antes.
clase_instanciada.saludar()

Espero se haya entendido!

denisseleiva commented 4 years ago

buenisimoo, muchas gracias!! @gatochico

javiermingo commented 4 years ago

se puede usar with open para abrir y editar archivo.txt?

gatochico commented 4 years ago

@javiermingo with open viene por defecto en python, por lo que sí puedes usarlo.

YehudaGurovich commented 4 years ago

@denisseleiva Eso sí se puede hacer, siempre y cuando se la pases a la función como un argumento 🤓. Lo que es considerado variable global es instanciarla fuera de todas las funciones con el fin de llamarla dentro de dichas funciones sin tener que dársela como argumento. Algo así:

# Definimos una clase
class Clase:
  def __init__(self):
    self.saludo = "Hello"

  def saludar(self):
    print(self.saludo)

# Se instancia
clase_instanciada = Clase()

# Defino esta función, que no recibe como parámetro la instancia
def funcion():
  # ...pero hago llamado a la instancia igual dentro de ella.
  # Incluso desde dentro de la función le cambio un atributo.
  clase_instanciada.saludo = "Hello world!"
# Ejecuto la función
funcion()
# Y cuando llamo a saludo de nuevo, el saludo ha cambiado :O
clase_instanciada.saludar()

Si ejecuto esto, me retornará: Hello World! y no Hello, por lo que se modificó el atributo de la clase al haber llamado a funcion(). Si embargo nunca le dimos clase_instanciada como argumento a funcion(). Esto es lo considerado mala práctica, ya que en códigos de gran tamaño, como las tareas, esto dificulta la lectura del código. Sin embargo, si a las funciones le pasas la clase como argumento, se puede saber de forma más fácil de donde provienen las clases y variables utilizadas.

Esto sí sería permitido:

# Definimos una clase
class Clase:
  def __init__(self):
    self.saludo = "Hello"

  def saludar(self):
    print(self.saludo)

# Se instancia
clase_instanciada = Clase()

# Ahora si le doy el argumento
def funcion(clase):
  # Le cambio el atributo, pero ya se de donde proviene la variable clase.
  clase.saludo = "Hello world!"
# Ejecuto la función con la clase instanciada como argumento.
funcion(clase_instanciada)
# Y cuando llamo a saludo de nuevo, ha cambiado el valor, pero ya no es tan confuso como antes.
clase_instanciada.saludar()

Espero se haya entendido!

Hablando de este tema (se que no tiene que ver con la issue pero justo salio el tema), me estaba preguntando como se hace en proyectos mas grandes donde hay muchas mas variables en el menu o algo por el estilo, uno no puede estar pasando 20 argumentos en cada función (se puede solucionar pasando solo 1 dicc pero igual no me parece ideal pasar algo de función en función a cada rato). No hay una forma de que se conserven los valores sin tener que estar pasandolos de función en función a cada rato?

aaossa commented 4 years ago

@YehudaGurovich , podrías preguntar eso en una nueva issue? Creo que es una buena pregunta, pero de esa manera queda claro que es algo aparte y es más fácil de encontrar después nuevamente 👌

YehudaGurovich commented 4 years ago

Ok!

rarrau commented 4 years ago

Hola! se puede ocupar PrettyTable?

gatochico commented 4 years ago

@RodrigoUC , No puedes usar PrettyTable 😞 . Investiga las otras opciones permitidas (beautifultable o pprint, por ejemplo).