¿Está bien usar guiones en los archivos de Python al intentar importarlos?

149

Básicamente cuando tengo un archivo python como:

python-code.py

y use:

import (python-code)

El intérprete me da error de sintaxis.

¿Alguna idea de cómo arreglarlo? ¿Son ilegales los guiones en los nombres de archivos de Python?

Joan Venge
fuente

Respuestas:

167

Debe consultar PEP 8 , la Guía de estilo para el código Python:

Nombres de paquetes y módulos Los módulos deben tener nombres cortos en minúsculas. Los guiones bajos se pueden usar en el nombre del módulo si mejora la legibilidad. Los paquetes de Python también deben tener nombres cortos en minúsculas, aunque se desaconseja el uso de guiones bajos.

Dado que los nombres de los módulos se asignan a los nombres de los archivos, y algunos sistemas de archivos no distinguen entre mayúsculas y minúsculas y truncan los nombres largos, es importante que los nombres de los módulos se elijan como bastante cortos; esto no será un problema en Unix, pero puede ser un problema problema cuando el código se transporta a versiones anteriores de Mac o Windows, o DOS.

En otras palabras: cambie el nombre de su archivo :)

Paolo Bergantino
fuente
75
el problema no tiene nada que ver con el estilo, es un error de sintaxis
44
Como se muestra a continuación, todavía es posible tener un archivo con este nombre, por lo que la guía de estilo es muy relevante.
Paolo Bergantino
55
Puede ser muy útil usar guiones en el directorio de Python y en los nombres de los archivos cuando desea evitar explícitamente las importaciones. Por ejemplo, en (digamos) un proyecto de Django, es posible que tenga scripts escritos en Python que no deberían ser direccionables como aplicaciones. Puede colocarlos en una carpeta como ops-scriptsy saber que no se pueden importar utilizando un enfoque de espacio de nombres de paquete normal. O se puede nombrar un solo script stop-website.pypara un efecto similar. Cualquiera de estos podría importarse a través de runpyotros métodos, por supuesto, pero esto ayuda a evitar algunos errores comunes.
Chris Johnson
Cambiar el nombre de un módulo puede ser problemático, especialmente si confía en otro estándar. En mi caso, estoy usando archivos python cgi en la cgi-bincarpeta (haciendo unitttests en ellos), que es bastante estándar afaik. A menos que tenga un caso raro como este, definitivamente cambie el nombre de su módulo si tiene control sobre él.
NuclearPeon
1
Acabo de descubrir que PyDev permitirá nombres de directorio con guiones, pero no mostrará las clases y / o variables internas en los archivos .py que están contenidos en ese directorio.
user5920660
123

Otra cosa a tener en cuenta en su código es que importar no es una función. Entonces import(python-code)debería ser lo import python-codeque, como algunos ya han mencionado, se interpreta como "importar Python menos código", no lo que pretendía. Si realmente necesita importar un archivo con un guión en su nombre, puede hacer lo siguiente:

python_code = __import__('python-code')

Pero, como también se mencionó anteriormente, esto no se recomienda realmente. Debes cambiar el nombre del archivo si es algo que controlas.

Rick Copeland
fuente
@KevinAudleman, ¿tiene un ejemplo de uso de import lib con un archivo con guiones? Lo intenté y fallé.
Tom Hale
@TomHale importlib.import_module ('abmodule-1') debería funcionar. Si su import_module no funciona, creo que una importación normal tampoco funcionará.
Ian Lin
64

TLDR

Los guiones no son ilegales, pero no debe usarlos por 3 razones:

  1. Necesita una sintaxis especial para importar archivos con guiones
  2. Nadie espera un nombre de módulo con un guión
  3. Va en contra de las recomendaciones de la Guía de estilo de Python

Si definitivamente necesita importar un nombre de archivo con un guión, la sintaxis especial es esta:

module_name = __import__('module-name')

¿Curioso por qué necesitamos una sintaxis especial?

La razón de la sintaxis especial es que cuando escribe import somenameestá creando un objeto de módulo con identificador somename(para que luego pueda usarlo con, por ejemplo somename.funcname). Por supuesto, module-nameno es un identificador válido y, por lo tanto, la sintaxis especial que da uno válido.

¿No entiendes por qué el nombre del módulo no es un identificador válido?

No te preocupes, yo tampoco. He aquí un consejo para ayudarle a: Mira esta línea de pitón: x=var1-var2. ¿Ves una resta en el lado derecho de la tarea o un nombre de variable con un guión?

PD

No hay nada original en mi respuesta, excepto incluir lo que considero que es la información más relevante de todas las otras respuestas en un solo lugar.

ndemou
fuente
Estoy tratando de usar esta importación de un paquete pip con un guión. psycopg2_binary = import_module('psycopg2-binary'). Error => ModuleNotFoundError: No module named 'psycopg2-binary'. Pero psycopg2-binaryestá instalado. No tengo idea de cómo incluirlo.
Mote Zart
Tal vez es un problema de ruta. Mira chrisyeh96.github.io/2017/08/08/…
ndemou el
32

El problema es que python-codeno es un identificador. El analizador ve esto como pythonmenos code. Por supuesto, esto no hará lo que estás pidiendo. Deberá usar un nombre de archivo que también sea un identificador válido de Python. Intenta reemplazarlo -con un guión bajo.

SingleNegationElimination
fuente
44
+1. Nunca pensé que el nombre del archivo fuente de Python debería ser un identificador válido, porque el nombre del archivo se usará para referirse al objeto del módulo.
Andy
5

Probablemente podría importarlo a través de algún __import__truco, pero si aún no sabe cómo, no debería. Los nombres de los módulos de Python deben ser nombres de variables válidos ("identificadores"); eso significa que si tiene un módulo foo_bar, puede usarlo desde Python ( print foo_bar). No podría hacerlo con un nombre extraño ( print foo-bar-> error de sintaxis).

John Millikin
fuente
5

En Python 3 use import_module :

from importlib import import_module
python_code = import_module('python-code')

Más generalmente,

import_module('package.subpackage.module')
e18r
fuente
1

Aunque el nombre correcto de los archivos es el mejor curso, si python-codeno está bajo nuestro control, un pirateo __import__es mejor que copiar, renombrar o jugar con el código de otros autores. Sin embargo, lo intenté y no funcionó a menos que cambie el nombre del archivo agregando la .pyextensión. Después de mirar el documento para obtener una descripción .py, terminé con esto:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

Creó un nuevo archivo python-codecen la primera ejecución.

Cerveza inglesa
fuente