2010-08-30 9 views
13

Siempre me pregunté por qué la sintaxis para importar objetos específicos de un módulo es from module import x, y, z en lugar de import x, y, z from module. No soy un hablante nativo, pero ¿no es este último más correcto/natural?Razonamiento detrás de `from ... import ...` sintaxis en Python

Entonces, ¿cuál es el motivo para poner el primero? ¿Es simplemente para simplificar la gramática (requiere menos anticipación)? ¿Es un intento de hacer las dos clases de importaciones visualmente más distintas? ¿O es uno de estos casos donde la forma obvia es "no obvia al principio a menos que seas holandés"? ;)

+1

Todavía estoy aprendiendo Python, pero en mi humilde opinión lo siguiente parece que hubiera sido más consistente con el resto del lenguaje: 'importación (módulo, x, y, z)'. No hay necesidad de 'de' en absoluto. – FMc

+5

@FM: si no desea que 'import' obtenga un tratamiento sintáctico especial, tendrá que escribir' import ('module', 'x', 'y', 'z') ', pasando los * nombres * de los objetos, porque los mismos objetos no están disponibles hasta * después de * la 'importación'. – dan04

+1

La mejor sintaxis de importación que he visto fue en Haskell: 'módulo de importación (a, b, c)'. Limpio, claro y hace que las declaraciones de importación múltiples se vean uniformes y alineadas (a excepción del caso de 'importación calificada', desafortunadamente). Y no tengo idea de por qué GvR eligió ese feo 'de ... importación'. – firegurafiku

Respuesta

17

No tengo idea de por qué fue en realidad hecho de esa manera, pero es la manera en que lo haría, simplemente porque, siendo un tipo de ingeniería, me parece más natural comenzar desde una categoría general y detallar detalles .

También significa que el analizador tendría que almacenar menos cosas si se procesa secuencialmente. Con:

import x,y,z from a 

usted tiene que recordar x, y y z. Con:

from a import x,y,z 

es suficiente con recordar a.


Por eso tuve tantos problemas cuando me encontré por primera vez de Perl post-Si variante:

$x = $y if $y > 40; 

ya que no sé con antelación si lo que estás leyendo es condicional o no.

+1

Ahora que mencionas "postfix if", creo que veo un bono de legibilidad ... +1, se aceptará a menos que uber-answer bei A.M. viene junto;) – delnan

+0

Oh, como A.M. necesita más rep ... – PaulMcG

11

Un cálculo muy salvaje y probablemente totalmente sin sentido, pero sabía que la sintaxis de Modula-2 (hombre, que fue hace veinte años, me siento viejo) ... tal vez Python se inspiró en él?

+2

Respuesta más simple, y muy probablemente correcta. GvR tomó construcciones de varios idiomas en el diseño de Python, incluido el Modula-2, y esto es probablemente un impulso directo de ese lenguaje. – PaulMcG

1

De hecho, no es tan extraño. Mira cómo "importamos", "incluye" o "requiere" en otros idiomas. Siempre especificamos el espacio de nombre primero. incluye "inc/config.php" en PHP, por ejemplo. De alguna manera, mantiene nuestra forma habitual de incluir archivos o módulos.

5

No conozco el patrimonio completo de esta sintaxis, ya que data de Python 1.x días. Pero me parece útil poder escanear el lado izquierdo de la fuente y encontrar rápidamente los nombres de los módulos de los que depende una secuencia de comandos. Si un enunciado dice "importar a, b, c, d, e, really_long_name, alsdf, lsdf from blah", me llevaría un tiempo encontrar que este script dependía de bla.

1

Podría tener más sentido en Inglés decir import x, y, z from module pero en la programación que tiene mucho más sentido para llevar el artículo más general primero y luego llevar los detalles. Puede que no sea la razón, pero hace las cosas más fáciles para el compilador o el intérprete. Intente escribir un compilador y sabrá lo que quiero decir: D

+0

Me doy cuenta completamente de la diferencia para el escritor de compiladores, pero si a * * como programador * le importara eso, me quedaría con el montaje con mnemónicos: D – delnan

+3

No solo para el compilador, también ayuda IDE para darle la opción, si primero debe escribir 'importar' el IDE no podría darle ninguna opción porque no sabía desde qué módulo desea importar – Scarlet

+1

Buen punto. Me recuerda a la sentencia SQL 'SELECT Columns FROM Table', que adolece de ese mismo problema con el autocompletado. – dan04

0

Depende de la sintaxis del lenguaje de programación que utilice. Es más fácil para mí leer una importación de este tipo.

es más fácil de leer y entender

From Grocery buy apple and orange 

o

Buy apple and orange from grocery. 
Buy apple and orange from supermarket 

primera me adapte mejor ...

5

Aparte de pedir directamente Guido, no creo que su va a encontrar cualquier explicación de esto.

La sintaxis ha existido desde el principio. La primera versión de las fuentes de Python que pude encontrar fue python 1.0.1. Al observar el registro de cambios en el archivo de Gramática, encontramos referencias incluso a versiones anteriores. En la versión 2 de Python (creo que estamos hablando de segundo después de la liberación 0.9.0) tenemos esta nota:

# added 'from' NAME option on import clause, and '*' to import all; 

Esto se añadió al mismo tiempo que

# added class definition. 

Así que la declaración de importación surgió al mismo tiempo que las clases se agregaron a Python. Esto viene de cuando Python fue el proyecto en solitario de Guido van Rossum. En otras palabras, la respuesta que estás buscando se pierde en las arenas del tiempo.

Ahora, aquí está mi especulación de por qué la declaración de importación dice from x import y en lugar de import y from x.

El documentation for the import statement proporciona el algoritmo básico para la implementación de la importación:

declaraciones de importación se ejecutan en dos pasos: (1) encontrar un módulo, y inicializarlo si es necesario; (2) defina un nombre o nombres en el espacio de nombres local (del ámbito donde se produce la instrucción import ). La declaración viene en dos formas que difieren en si usa la palabra clave from. El primer formulario (sin desde) repite estos pasos para cada identificador en la lista. El formulario con from realiza el paso (1) una vez, y luego realiza el paso (2) repetidamente.

En ambas versiones de la instrucción de importación, el primer paso de este algoritmo es el extremo izquierdo. Supongo que este fue el orden más obvio para un implementador de lenguaje, aunque el inglés podría leerse más naturalmente si el orden se revierte.

+0

¡Gracias por excavar! – delnan

Cuestiones relacionadas