172 votes

Est-il possible d'utiliser des tirets dans les fichiers Python lorsqu'on essaie de les importer ?

En gros, quand j'ai un fichier python comme :

python-code.py

et l'utiliser :

import (python-code)

l'interpréteur me donne une erreur de syntaxe.

Des idées sur la façon de le réparer ? Les tirets sont-ils illégaux dans les noms de fichiers python ?

188voto

Paolo Bergantino Points 199336

Vous devriez vérifier PEP 8 le Guide de style pour le code Python :

Noms des paquets et des modules Les modules doivent avoir des noms courts, entièrement en minuscules. Les underscores peuvent être utilisés dans le nom du module si cela améliore la lisibilité. Les paquets Python doivent également avoir des noms courts, tout en minuscules, bien que l'utilisation de caractères de soulignement soit déconseillée.

Puisque les noms de modules sont associés aux noms de fichiers, et que certains systèmes de fichiers sont insensibles à la casse et tronquent les noms longs, il est important que les noms de modules soient choisis assez courts -- cela ne posera pas de problème sous Unix, mais cela peut en poser un lorsque le code est transporté vers des versions plus anciennes de Mac ou Windows, ou DOS.

En d'autres termes : renommez votre fichier :)

86 votes

Le problème n'a rien à voir avec le style, c'est un syntaxe erreur

5 votes

Comme indiqué ci-dessous, il est possible d'avoir un fichier portant ce nom, le guide de style est donc tout à fait pertinent.

6 votes

Il peut être très utile d'utiliser des traits d'union dans les noms de fichiers et de répertoires Python lorsque vous souhaitez explicitement empêcher les importations. Par exemple, dans (disons) un projet Django, vous pouvez avoir des scripts écrits en Python qui ne doivent pas être adressables en tant qu'applications. Vous pouvez les placer dans un dossier comme ops-scripts et savoir qu'ils ne peuvent pas être importés en utilisant une approche normale d'espace de nom de paquet. Ou un seul script pourrait être nommé stop-website.py pour un effet similaire. Tous ces éléments peuvent encore être importés via runpy et d'autres méthodes bien sûr, mais cela permet d'éviter certaines erreurs courantes.

132voto

Rick Copeland Points 5343

Une autre chose à noter dans votre code est que import n'est pas une fonction. Donc import(python-code) devrait être import python-code qui, comme certains l'ont déjà mentionné, est interprété comme "import python moins le code", ce qui n'est pas ce que vous vouliez. Si vous avez vraiment besoin d'importer un fichier avec un tiret dans son nom, vous pouvez faire ce qui suit : :

python_code = __import__('python-code')

Mais, comme il a été dit plus haut, ce n'est pas vraiment recommandé. Vous devriez changer le nom du fichier si c'est quelque chose que vous contrôlez.

0 votes

@KevinAudleman avez-vous un exemple fonctionnel d'utilisation de import lib avec un fichier à césure ? J'ai essayé et échoué.

0 votes

@TomHale importlib.import_module('a.b.module-1') devrait fonctionner. Si votre import_module ne fonctionne pas, je pense qu'un import normal ne fonctionnera pas non plus.

87voto

ndemou Points 324

TLDR

Les tirets sont no illégales mais vous ne devriez pas les utiliser pour 3 raisons :

  1. Vous avez besoin d'une syntaxe spéciale pour importer des fichiers avec des tirets
  2. Personne ne s'attend à un nom de module avec un tiret
  3. C'est contre les recommandations de la Guide de style Python

Si vous avez absolument besoin d'importer un nom de fichier avec un tiret, la syntaxe spéciale est la suivante :

module_name = __import__('module-name')

Vous voulez savoir pourquoi nous avons besoin d'une syntaxe spéciale ?

La raison de cette syntaxe spéciale est que lorsque vous écrivez import somename vous créez un objet module avec l'identifiant somename (afin que vous puissiez l'utiliser ultérieurement avec, par exemple, la fonction somename.funcname ). Bien entendu module-name n'est pas un identifiant valide, d'où la syntaxe spéciale qui en donne un valide.

Vous ne comprenez pas pourquoi module-name n'est pas un identifiant valide ?

Ne t'inquiète pas je ne l'ai pas fait non plus. Voici une astuce pour t'aider : Regarde cette ligne python : x=var1-var2 . Voyez-vous une soustraction sur le côté droit de l'affectation ou un nom de variable avec un tiret ?

PS

Rien d'original dans ma réponse, si ce n'est que j'ai inclus ce que je considérais comme les éléments d'information les plus pertinents de toutes les autres réponses en un seul endroit.

0 votes

J'essaie d'utiliser cette fonction pour importer un paquet pip contenant un trait d'union. psycopg2_binary = import_module('psycopg2-binary') . Erreur => ModuleNotFoundError: No module named 'psycopg2-binary' . Mais psycopg2-binary est installé. Je ne sais pas comment l'inclure.

0 votes

C'est peut-être un problème de chemin. Regardez chrisyeh96.github.io/2017/08/08/…

0 votes

1 > "TLDR" 2 > "Rien d'original dans ma réponse, si ce n'est que j'ai inclus ce que je considérais comme les éléments d'information les plus pertinents de toutes les autres réponses en un seul endroit" Ces deux déclarations ci-dessus sont-elles cohérentes ? :)

34voto

IfLoop Points 59461

Le problème est que python-code n'est pas un identifiant. L'analyseur syntaxique voit cela comme python moins code . Bien entendu, cela ne répond pas à votre demande. Vous devrez utiliser un nom de fichier qui est également un identifiant python valide. Essayez de remplacer le - avec un trait de soulignement.

6 votes

+1. Je n'ai jamais pensé que le nom de fichier du code source Python devait être un identifiant valide, car le nom du fichier sera utilisé pour faire référence à l'objet module.

10voto

Emi Points 11

Sur Python 3, utilisez module d'importation :

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

Plus généralement,

import_module('package.subpackage.module')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X