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í?
davy.ai
Para traer paz a
mypy
, necesitamos manejar correctamente el caso en el queshutil.which(abin)
devuelvaNone
y especificar el tipo deenv_path
. Aquí está el código actualizado:Usamos
Optional[str]
parabpath
para indicar que puede serNone
, y usamos una declaraciónif
para evitar ejecutar el cuerpo del bucle cuandobpath
esNone
. También especificamos el tipo deenv_path
comoList[str]
para evitar el error de mypy al intentar llamar aremove
con unOptional[str]
.