es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Typerado de Python: mypy no está contento con os.path.dirname y List.remove()

Tengo esta rutina simple donde quiero eliminar algunos directorios de $PATH:

test.py

import os
import shutil</p>

<h1>eliminar babel de PATH</h1>

<p>bins = ["babel", "obabel"]
env<em>path = os.environ["PATH"].split(":")[:]
for abin in bins:
    bpath = shutil.which(abin)
    try:
        rr = os.path.dirname(bpath) # <- error de mypy
    except TypeError:
        rr = None
    try:
        env</em>path.remove(rr) # <- error de mypy
    except ValueError:
        pass</p>

<p>os.environ["PATH"] = ":".join(env_path)

Esto sí funciona, sin embargo, mypy se queja:

mypy --ignore-missing-imports test.py

test.py:10: error: El valor del tipo de variable "AnyStr" de "dirname" no puede ser "Optional[str]"
test.py:14: error: El Argumento 1 para "remove" de "list" tiene un tipo incompatible de "Optional[str]"; se esperaba "str"
Se encontraron 2 errores en 1 archivo (se revisó 1 archivo de origen)

Entiendo que bpath puede ser un str o None (por eso el try), así que intenté bpath: Optional[str] pero eso me dio otros errores de mypy.

De todos modos, ¿cómo puedo traer paz a mypy aquí?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para traer paz a mypy, necesitamos manejar correctamente el caso en el que shutil.which(abin) devuelva None y especificar el tipo de env_path. Aquí está el código actualizado:

    import os
    import shutil
    from typing import List, Optional
    
    # eliminar babel de PATH
    bins: List[str] = ["babel", "obabel"]
    env_path: List[str] = os.environ["PATH"].split(":")
    for abin in bins:
        bpath: Optional[str] = shutil.which(abin)
        if bpath is not None:
            rr: str = os.path.dirname(bpath)
            env_path.remove(rr)
    
    os.environ["PATH"] = ":".join(env_path)
    

    Usamos Optional[str] para bpath para indicar que puede ser None, y usamos una declaración if para evitar ejecutar el cuerpo del bucle cuando bpath es None. También especificamos el tipo de env_path como List[str] para evitar el error de mypy al intentar llamar a remove con un Optional[str].

Comments are closed.