os.path.basename funciona con URL, ¿por qué?

>>> os.path.basename('http://example.com/file.txt') 'file.txt' 

.. y pensé que os.path.* funciona solo en rutas locales y no en URL? Tenga en cuenta que el ejemplo anterior también se ejecutó en Windows … con un resultado similar.

En la práctica, muchas funciones de os.path son simplemente funciones de manipulación de cadenas (que resultan ser especialmente útiles para la manipulación de rutas), y como es inocuo y ocasionalmente útil, aunque formalmente hablando “incorrecto”, dudo que esto cambie pronto. – para más detalles, use la siguiente línea simple en un shell / comando:

 $ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]" 

O, para Python 3:

 $ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])" 

En Windows, mire el código fuente: C: \ Python25 \ Lib \ ntpath.py

 def basename(p): """Returns the final component of a pathname""" return split(p)[1] 

os.path.split (en el mismo archivo) simplemente divide “\” (y sth. else)

Usa la fuente de Lucas:

 def basename(p): """Returns the final component of a pathname""" i = p.rfind('/') + 1 return p[i:] 

Editar (respuesta a la aclaración):

Funciona para las URL por accidente, eso es todo. Debido a eso, explotar su comportamiento podría ser considerado un olor de código por algunos.

Tratar de “arreglarlo” (comprobar si la ruta pasada no es url) también es sorprendentemente difícil

 www.google.com/test.php me@other.place.com/12 ./src/bin/doc/goto.c 

al mismo tiempo son correctas las rutas de acceso y las URL (relativas), por lo que es http:/hello.txt (uno /, y solo en Linux, y es un poco estúpido :)). Podría “arreglarlo” para las URL absolutas, pero las relativas seguirán funcionando. Manejar un caso especial de manera diferente es un gran no no en el mundo de los pitones.

Para resumir: importar esto

La barra inclinada también es un delimitador de ruta aceptable en Windows.

Es simplemente que la línea de comando no acepta rutas que comiencen con / porque ese carácter está reservado para los conmutadores args.

Tenga cuidado con las URL con parámetros, anclajes o cualquier cosa que no sea una URL “simple”:

 >>> import os.path >>> os.path.basename("protocol://fully.qualifie.host/path/to/file.txt") 'file.txt' >>> os.path.basename("protocol://fully.qualifie.host/path/to/file.txt?param1&param1#anchor") 'file.txt?param1&param1#anchor' 

¿Por qué? Porque es útil para analizar las direcciones URL y las rutas de archivos locales. Por qué no?