2009-04-17 8 views

risposta

114

Si dovrebbe verificare PEP 8, la Guida allo stile per il codice Python:

pacchetto e moduli di nomi dei moduli dovrebbero avere nomi brevi e tutti-minuscole. I caratteri di sottolineatura possono essere utilizzati nel nome del modulo se migliora la leggibilità. I pacchetti Python dovrebbero anche avere nomi brevi, tutti minuscoli, sebbene l'uso dei caratteri di sottolineatura sia scoraggiato.

Poiché i nomi dei moduli sono mappati ai nomi dei file, e alcuni file system sono case insensitive e troncati nomi lunghi, è importante che i nomi dei moduli siano scelti in modo abbastanza breve - questo non sarà un problema su Unix, ma potrebbe essere un problema quando il codice viene trasportato a versioni precedenti di Mac o Windows o DOS.

In altre parole: rinominare il file :)

+42

il problema non ha nulla a che fare con lo stile, è un _syntax_ _error_ – hop

+1

Come mostrato di seguito, è possibile avere ancora un file con questo nome, quindi la guida di stile è molto rilevante. –

+3

Può essere molto utile utilizzare i trattini nei nomi di directory e file Python quando si desidera evitare esplicitamente le importazioni. Ad esempio in (ad esempio) un progetto Django, potresti avere script scritti in Python che non dovrebbero essere indirizzabili come applicazioni. Puoi metterli in una cartella come "ops-scripts" e sapere che non possono essere importati usando un normale approccio allo spazio dei nomi dei pacchetti. Oppure un singolo script potrebbe essere denominato 'stop-website.py' per un effetto simile. Ognuno di questi potrebbe ancora essere importato tramite 'runpy' e altri metodi, naturalmente, ma questo aiuta a evitare alcuni errori comuni. –

23

Il problema è che python-code non è un identificatore. Il parser vede questo come python meno code. Ovviamente questo non farà quello che stai chiedendo. Sarà necessario utilizzare un nome file che sia anche un identificatore Python valido. Prova a sostituire - con un trattino basso.

+1

+1. Non avrei mai pensato che il nome del file del codice sorgente Python dovesse essere un identificatore valido, perché ** il nome del file ** sarà usato per fare riferimento all'oggetto modulo. – andy

3

Probabilmente si può importarlo attraverso qualche __import__ hack, ma se non si conosce già come, non si dovrebbe. I nomi dei moduli Python dovrebbero essere nomi di variabili validi ("identificatori") - ciò significa che se si ha un modulo foo_bar, è possibile utilizzarlo da Python (print foo_bar). Non sarebbe possibile farlo con un nome strano (print foo-bar -> errore di sintassi).

91

Un'altra cosa da notare nel codice è che l'importazione non è una funzione. Quindi import(python-code) dovrebbe essere import python-code che, come alcuni hanno già menzionato, è interpretato come "import python minus code", non è quello che intendevi. Se avete veramente bisogno di importare un file con un trattino nel suo nome, è possibile effettuare le seguenti operazioni ::

python_code = __import__('python-code') 

Ma, come già accennato, questo non è davvero consigliato. Dovresti cambiare il nome del file se è qualcosa che controlli.

+0

http://docs.python.org/2/library/importlib.html –

15

TLDR

trattini sono non illegale, ma non dovrebbero usarli per 3 motivi:

  1. È necessario sintassi speciale per importare i file con i trattini
  2. nessuno si aspetta un nome di modulo con un trattino
  3. È contro le raccomandazioni dello Python Style Guide

Se avete sicuramente bisogno di importare un nome di file con un trattino la sintassi speciale è questo:

module_name = __import__('module-name') 

incuriosisce perché abbiamo bisogno di una sintassi speciale?

La ragione per la sintassi speciale è che quando si scrive import somename si sta creando un oggetto modulo con identificatore somename (in modo da poter poi utilizzare con per esempio somename.funcname). Ovviamente module-name non è un identificatore valido e quindi la sintassi speciale che fornisce una valida.

Non si capisce perché il nome del modulo non sia un identificatore valido?

Non preoccuparti, non l'ho fatto neanche io. Ecco un consiglio per aiutarti: guarda questa linea di pitone: x=var1-var2. Vedete una sottrazione sul lato destro del compito o un nome di variabile con un trattino?

PS

nulla di originale nella mia risposta ad eccezione tra cui quello che ritenevo essere i bit più rilevanti di informazioni provenienti da tutte le altre risposte in un unico luogo

Problemi correlati