Uso PyCharm para mi programa de Python, y escribí los códigos a continuación:

def get_files_name():
    root_dir = "/Volumes/NO NAME/"
    for root, ds, fs in os.walk(root_dir):
        for f in fs:
            print(os.path.join(root_dir, f))


get_files_name()
for root, ds, fs in os.walk(other_dir):
    pass

Entonces recibo un texto de Advertencia como "Nombre de sombras 'ds' del alcance externo". Sé el efecto del alcance, pero todavía quiero usar el mismo formato de código como "para root, ds, fs en ..." en el alcance interno o externo del alcance.

He buscado PEP8, sin embargo, todavía no sé cómo nombrar variables en función normativamente.

¿Podrías darme alguna sugerencia?

5
GoldenMan 4 mar. 2018 a las 12:51

3 respuestas

La mejor respuesta

En general: simplemente ignore la advertencia. Es solo una advertencia, no un error. Tiene uso para nombres globales y locales que coinciden.

Sin embargo, no pondría una llamada os.walk() en alcance global de todos modos . Prefiero poner eso en una función también, que tiene el feliz efecto secundario de que los nombres que usaste ya no son globales.

Por ejemplo, podría usar una función main():

def main():
    get_files_name()
    for root, ds, fs in os.walk(other_dir):
        pass

if __name__ == '__main__':
    main()

En general, no desea dejar nombres de bucles como root, ds, fs como globales en su módulo de todos modos. Esos son detalles de implementación y no deben formar parte de la API pública de un módulo. Si tiene para utilizar un bucle for como ese en el ámbito global, use _ prefijos de subrayado simple en los nombres y considere eliminarlos después del bucle con {{X3 }}:

for _root, _ds, _fs in os.walk(other_dir):
    # do something with the files or directories

# clean variables for the loop that are not part of the API
del _root, _ds, _fs
3
Martijn Pieters 4 mar. 2018 a las 10:07

Si sus nombres se repiten, use "_" para evitar tales advertencias. Es una práctica común.

def get_files_name():
    root_dir = "/Volumes/NO NAME/"
    for root, _ds, fs in os.walk(root_dir):
        for f in fs:
            print(os.path.join(root_dir, f))

get_files_name()
for root, _ds, fs in os.walk(other_dir):
    pass
1
Alex Delarge 4 mar. 2018 a las 10:02

Esa advertencia shadows name XX from outer scope no es un problema PEP8, sino una advertencia real de Pycharm para decirle que reutilizar nombres de variables de esa manera es una mala idea. En otras palabras, este no es un problema de estilo de código, sino algo que puede traer problemas más adelante en programas más grandes.

Mi sugerencia sería, bueno, evitar reutilizar nombres de variables cuando sea posible. Escribiendo esto:

for root_path, directory_name, file_name in os.walk(root_dir):

No toma mucho tiempo y evitaría efectos secundarios indeseables en el futuro.

Aún así, si por alguna razón necesita reutilizar nombres de variables y desea deshacerse del mensaje de advertencia, puede deshabilitarlo en Pycharm (Preferencias -> Editor -> Estilo de código -> Inspecciones -> sombrear nombres de ámbitos externos). Pero esto suele ser una mala idea.

0
carrdelling 4 mar. 2018 a las 10:27