2012-04-04 10 views
6

En Python 3.2, de acuerdo con esto: http://docs.python.org/py3k/reference/expressions.html#summaryEn Python 3.2, ¿se considera "lambda" una "palabra clave", un "operador" o ambos?

lambda es el operador con la precedencia más bajo en Python.

Y de acuerdo con esto: http://docs.python.org/py3k/reference/lexical_analysis.html#keywords

lambda es una palabra clave lenguaje Python.

Sin embargo, de acuerdo con esto: http://docs.python.org/py3k/reference/lexical_analysis.html#other-tokens

Los operadores y palabras clave son entidades distintas.

Estoy tratando de explicar sistemáticamente Python 3.2 a alguien y no quiero confundirlos. Yo, yo mismo, estoy confundido, sobre las definiciones exactas de operadores y palabras clave.

Mi mejor estimación es que el término "operador" significa algo ligeramente diferente cuando se usa en el contexto del analizador de Python en comparación con el analizador de Python.

+0

Estoy bastante seguro de que es sensato llamar a 'lambda' una palabra clave en lugar de un operador. – alberge

+1

@alberge ¿Cuál es su razonamiento? – Paragon

+2

Claramente contraté los dedos antes que el cerebro. Varias palabras clave de python * son * operadores. Parecen ser conjuntos superpuestos. – alberge

Respuesta

2

lambda claramente es una palabra clave; es una palabra especial reconocida por el analizador, que de lo contrario caería dentro de la definición de identifier.

lambda no es semánticamente operador. Un operador es solo una función, pero invocado con una sintaxis diferente. Podemos imaginarnos reemplazar al operador + con una función add; todos nuestros programas con adición serían más detallados y difíciles de leer, pero aún podríamos escribirlos. El constructo de lenguaje lambda por otro lado no se pudo reemplazar con una función; lambda x: x+1 no es solo calcular un resultado de los valores x y x+1, porque en este contexto no son valores en absoluto (x es el nombre del parámetro para la función que se está definiendo, y x+1 es el código del cuerpo lambda).

En la misma página se ha vinculado a que tenemos: http://docs.python.org/py3k/reference/lexical_analysis.html#operators

Los siguientes símbolos son operadores:

+  -  *  ** /  //  % 
<<  >>  &  |  ^  ~ 
<  >  <=  >=  ==  != 

Eso es todo el contenido de la subsección sobre los operadores. De esto lo tomo para significar que en el contexto de definir los símbolos del lenguaje "operadores" son operadores simbólicos, mientras que la sección palabras clave está explícitamente deletreando que "estas cosas que de otro modo serían identificadores son palabras clave". Es por eso que creo que los operadores de palabra clave como not, is, in, etc. no aparecen en la lista. Pero ciertamente hay cosas que son semánticamente operadores que son palabras clave, ya sea que el analizador las considere clases separadas o no.

No estoy seguro de por qué http://docs.python.org/py3k/reference/expressions.html#summary describe lambda como operador; Ciertamente no lo haría. Estrictamente hablando, no dice explícitamente "lambda es el operador con la precedencia más baja", solo enumera lambda en una tabla cuyo encabezado de columna es "Operador". Tal vez fue solo una conveniencia; describir lambda como una cosa con baja precedencia es una buena forma de aclarar cómo analizará Python lambda x: x + 1 (teóricamente podría ser (lambda x: x) + 1 o lambda x: (x + 1)).

+0

El hecho de que no podamos reemplazar la construcción 'lambda' con una función diferente, no hace que' lambda' no sea una función. Es una función algo unaria (si saca el parámetro matcher) que toma una expresión y devuelve una función. Es claramente un operador ya que toma una expresión y devuelve una expresión (de tipo función). – poke

+0

@poke No, no es una función, precisamente porque necesita una expresión. No pasa expresiones a funciones, pasa valores. Si intenta ver 'lambda' no le" pasa "un valor, le pasa una expresión (que no puede" pasarse "a ningún otro tipo de función). De lo contrario, sería válido vincular la expresión a un nombre y pasar el nombre en su lugar: 'x = fire_ze_missiles(); f = lambda: x' es ** muy ** diferente de 'f = lambda: fire_ze_missiles()', mientras '' x = fire_ze_missiles(); y = x + 1' es equivalente a 'y = fire_ze_missiles() + 1'. – Ben

+0

Estoy de acuerdo: 'lambda' no" huele "a un operador. Y como usted nota, las tablas de precedencia no son solo para los operadores: en realidad son una forma para que los humanos manejen fortalezas vinculantes cuando observan lo que de otra manera sería un análisis ambiguo.Simplemente estamos acostumbrados a ver tanta ambigüedad al tratar con expresiones-con-operadores. – torek

2

Eso no dice que son mutuamente excluyentes, sólo que:

"existen las siguientes categorías de símbolos: identificadores, palabras clave, literales, operadores y delimitadores"

Estoy en las categorías persona y estadounidense. De acuerdo, puede implicar que son mutuamente excluyentes, en cuyo caso los documentos son inconsistentes.

+0

Esa frase me molesta, por eso y porque no dio un término general para INDENT, DEINDENT y NEWLINE. Cuando explico la noción de un token de Python, no sé si debería combinar esos tres en un solo tipo o dejarlos por separado. Supongo que eso es irrelevante para esta pregunta, pero estoy tratando de sistematizar lo básico de Python. –

+0

Esos tres son separadores/marcadores de declaraciones. INDENT Y DEINDENT se usan para marcar declaraciones compuestas (y cuerpos de clase y función), mientras que NEWLINE separa declaraciones simples. –

+0

He estado estudiando la gramática; ¿Conoces el término oficial para ello y puedes citarlo? El documento que estoy escribiendo: quiero que use solo la jerga oficial, si es posible. –

4

Los operadores y las palabras clave son entidades distintas.

No, no lo son. is, in, and, or, not, y estoy seguro de que algunas más son ambas.

+0

¿Por qué esto no los menciona como operadores? Implica (informalmente) que enumera todos los tokens que son operadores. Esos son claramente tokens, pero no están en la lista: http://docs.python.org/py3k/reference/lexical_analysis.html#operators –

+0

Simplemente porque ya están en la lista de palabras clave reservadas. – poke

Cuestiones relacionadas