2009-08-10 13 views
7

¿Solo me pregunto cuántas personas usan un módulo de ruta en Python como el de Jason Orendorff, en lugar de usar os.path para unir y dividir rutas? ¿Ha utilizado:¿Qué módulo de camino o clase usan los usuarios de Python en lugar de os.path?

Sé que el camino de Jason módulo se hizo en PEP 355 y rechazado por el BDFL. Parece que fue principalmente porque intentó hacer todo en una clase.

Nuestro caso de uso es principalmente para simplificar la unión y división de componentes de rutas, por lo que estaríamos muy contentos si dicha clase de ruta solo implementara las operaciones de tipo split/join. ¿Quién no querría hacer esto:

path(build_dir, path(source_file).name) 

o esto:

build_dir/path(source_file).name 

en lugar de esto:

os.path.join(build_dir, os.path.basename(source_file)) 
+0

parece [Python 3 tiene pathlib] (https://www.python.org/dev/ peps/pep-0428 /) y hay [un backport para Python 2] (https://pypi.python.org/pypi/pathlib2/). –

Respuesta

11

puedo recoger un programa de Python e interpretar el método estándar actual sin dudarlo: es explícito y no hay ambigüedad:

os.path.join(build_dir, os.path.basename(source_file)) 
tipado dinámico

de Python hace que el primer método bastante difícil de comprender cuando se lee:

build_dir/path(source_file).name 

Además de que no es común dividir las cuerdas, lo que nos lleva a más confusión. ¿Cómo sé que esos dos no son enteros? ¿O flota? No obtendrá un TypeError en tiempo de ejecución si ambos terminan como tipos no de cadena.

Por último,

path(build_dir, path(source_file).name) 

¿Cómo es que nada mejor que el método os.path?

Si bien pueden "simplificar" la codificación (es decir, hacer que sea más fácil escribir), se encontrará con conflictos si alguien que no está familiarizado con los módulos alternativos necesita mantener el código.

Así que supongo que mi respuesta es: No uso un módulo de ruta alternativo. os.path tiene todo lo que necesito, y su interfaz no es tan mala.

+2

¡Escucha, escucha! No hay nada tan horriblemente mal con el módulo os.path estándar para garantizar la adición de más dependencias a su proyecto. Si tiene un problema de construcción de camino particularmente peludo, como construir una ruta desde una jerarquía de objetos, ¿por qué no ajustar eso en una función? El próximo programador le agradecerá encapsularlo y no obligarlo a aprender y depurar otro módulo completo. – Theran

+0

Gracias por la respuesta, Matthew. Y un buen comentario, Theran: tienes razón al factorizar las cosas en funciones; esto ya ha simplificado mi secuencia de comandos. De hecho, creo que ustedes dos nos han convencido. Además, supongo que siempre hay "desde la ruta de importación" si solo queremos un poco más de brevedad. –

+0

Sin ambigüedad, correcto, pero es un dolor escribir y un dolor de leer. Preferiría tratar con un objeto Path inmóvil como Java ['java.nio.file.Path'] (https://docs.oracle.com/javase/7/docs/api/java/nio/file/Path. html) que una Cadena. Ejemplo: 'con build_dir.child ('config.yaml'). Open() como f' vs' con open (os.path.join (build_dir, 'config.yaml')) como f' - el flujo lógico es más consistentemente de izquierda a derecha, y con menos paréntesis anidados, por lo que es más fácil de leer y comprender. –

-1

La división de cadenas para unir caminos puede parecer un "truco ingenioso", pero es precisamente ese tipo de cosas que a los programadores de Python les gusta evitar (y por cierto, programadores en la mayoría de otros lenguajes). El módulo os.path es ampliamente utilizado y fácil de entender para todos. Hacer cosas funky con operadores sobrecargados por otro lado es confuso, afecta la legibilidad de su código, que se supone que es uno de los puntos fuertes de Python.

Los programadores de C++, por el contrario, aman ese tipo de cosas. Quizás esa es una de las razones por las que el código C++ puede ser tan difícil de leer.

2

Un truco simple pero útil es la siguiente:

importación OS

Path = os.path.join

Entonces, en lugar de esto:

OS .path.join (dir_desarrollo, os.path.basename (archivo_fuente))

Usted puede hacer esto:

Path (BUILD_DIR, Path (fichero_origen))

+1

Hago esto todo el tiempo, pero uso 'pj' en lugar de' Path'. :-) –

Cuestiones relacionadas