2011-05-15 20 views
11

Soy nuevo en Python y no he descubierto una manera simple de separar el código en múltiples archivos de código y carpetas.Trabajando con múltiples archivos de código y carpetas en Python

Lo que hago hoy es: para cada carpeta se crea un archivo __init__.py. Algunas veces está vacío. No sé por qué lo hago, pero parece necesario. Esa es la primera diferencia de trabajar con C#.

La segunda diferencia es que para cualquier archivo para hacer referencia a cualquier otra Debo usar una importación, como from model.table import Table. Y si tengo varias referencias que tenga que utilizar múltiples importaciones:

from model import table1,table2 

y luego en el resto del código que debe utilizar table1.Table1 por ejemplo. Si yo no quiero, lo que debería

from model.table1 import Table1 
from model.table2 import Table2 

y luego puedo utilizar simplemente Table1

que difiere demasiado de lo que estoy acostumbrado en C#, donde si todos los archivos estaban en el mismo espacio de nombres, no tuvimos que llamar al import. ¿Hay una manera más simple para mí?

Respuesta

14

Usted debe leer en módulos: http://docs.python.org/tutorial/modules.html

Básicamente, creo que no se está organizando el código correcto. Con python, los directorios y archivos tienen un significado; no es solo lo que escribes en los archivos. Con cada nuevo directorio (con __init__.py) y cada nuevo archivo crea un nuevo "espacio de nombres" ...

Si tiene el archivo /mydatabase/model.py y la Table1, Table2, etc definido en ese archivo model.py puede simplemente:

from mydatabase.model import * 

No cree un nuevo archivo para cada clase Table!

2

El sistema de importación de Python es bastante similar a los espacios de nombres de C# 's de lo que entiendo de ella. Puede personalizar el comportamiento de importación de los módulos en __init__.py si realmente lo desea. También puede usar import * o from x import * para extraer todos los objetos públicos definidos por un módulo en su espacio de nombres actual.

considerar en C#:

using System; 
Console.WriteLine("hello world!"); 

en Python, se puede hacer (el uso de esta situación completamente artificial):

system/ 
system/__init__.py 
system/console.py 

En __init__.py:

import console 

En system/console.py:

import sys 

def write_line(s): 
    sys.stdout.write(s) 

Ahora en su código Python que podría hacer:

from system import * 
console.write_line('hello world!') 

Esto no se considera generalmente una buena idea en Python, sin embargo. Por un poco más de detalle y buenas recomendaciones, echa un vistazo a este artículo: http://effbot.org/zone/import-confusion.htm

Cuestiones relacionadas