Un amigo me preguntó la semana pasada cómo enumerar o enumerar todas las variables dentro de un programa / función / etc. con el propósito de depurar (básicamente, obtener una instantánea de todo para que pueda ver en qué variables están configuradas, o si están configuradas). Miré un poco a mi alrededor y encontré una forma relativamente buena de Python:
#! / usr / bin / python foo1 = "Hola mundo" foo2 = "barra" foo3 = {"1": "a", "2": "b"} foo4 = "1 + 1" para el nombre en dir (): myvalue = eval (nombre) imprimir nombre, "es", tipo (nombre), "y es igual a", myvalue
que dará como resultado algo como:
__builtins__ es <tipo 'str'> y es igual a <módulo '__builtin__' (integrado)> __doc__ es <tipo 'str'> y es igual a Ninguno __file__ es <tipo 'str'> y es igual a ./foo.py __name__ es <tipo 'str'> y es igual a __main__ foo1 es <tipo 'str'> y es igual a Hola mundo foo2 es <tipo 'str'> y es igual a bar foo3 es <tipo 'str'> y es igual a {'1': 'a', '2': 'b'} foo4 es <tipo 'str'> y es igual a 1 + 1
Hasta ahora he encontrado una forma parcial en PHP (cortesía del texto del enlace ) pero solo enumera todas las variables y sus tipos, no el contenido:
<? php // crea algunas variables $ bar = 'foo'; $ foo = 'barra'; // crea un nuevo objeto de matriz $ arrayObj = new ArrayObject (get_defined_vars ()); // bucle sobre el objeto de matriz y echo variables y valores para ($ iterador = $ arrayObj-> getIterator (); $ iterator-> valid (); $ iterator-> next ()) { echo $ iterador-> tecla (). '=>'. $ iterador-> actual (). '<br />'; } ?>
Así que te lo planteo: ¿cómo enumeras todas las variables y sus contenidos en tu idioma favorito?
Editar por VonC : Propongo que esta pregunta sigue el espíritu de un pequeño " desafío de código ".
Si no está de acuerdo, simplemente edite y elimine la etiqueta y el enlace.
Respuestas:
En python, el uso de locales que devuelve un diccionario que contiene todos los enlaces locales, evitando así eval:
fuente
Así es como se vería en Ruby :
que saldrá
Sin embargo, ¿no pretendía generar el tipo de objeto al que hace referencia la variable en lugar del tipo utilizado para representar el identificador de la variable? IOW, el tipo de
foo3
debería serHash
(odict
) en lugar deString
, ¿verdad? En ese caso, el código seríay el resultado es
fuente
instance_variable_get(instance_variables[0])
IPython:
También puede recomendar Spyder a su amigo, que muestra esas variables de forma muy similar a como lo hace Matlab y proporciona una GUI para la depuración línea por línea.
fuente
En php puedes hacer esto:
fuente
En Lua, la estructura de datos fundamental es la tabla e incluso el entorno global _G es una tabla. Entonces, una simple enumeración funcionará.
fuente
Intento:
Descargo de responsabilidad: ¡No es mi idioma favorito!
fuente
env
para averiguar los valores no exportados.Una línea de PHP completamente recursiva:
fuente
Primero, simplemente usaría un depurador ;-p Visual Studio, por ejemplo, tiene ventanas "Locals" y "Watch" que mostrarán todas las variables, etc. que desee, completamente expandibles a cualquier nivel.
En C # realmente no puede acceder a las variables de método con mucha facilidad (y es posible que el compilador las elimine), pero puede acceder a los campos, etc.mediante la reflexión:
fuente
Perl. No maneja
my
locales y no filtra algunas referencias inútiles, pero se puede ver todo en el alcance del paquete.fuente
Matlab:
fuente
En el lenguaje R
y eliminar todos los objetos de la memoria de trabajo
fuente
En Java, el problema sería similar a C #, sólo en un modo más detallado (lo sé, SÉ ;) Java es prolijo ... que hizo que ya está claro;) )
Puede acceder a los campos de objeto a través de Refection, pero es posible que no acceda fácilmente a las variables locales del método. Entonces, lo siguiente no es para código de análisis estático, sino solo para depuración en tiempo de ejecución.
fuente
AccessController
es innecesario en una aplicación independiente (bueno,setAccessible
es innecesario para acceder a sus propios campos de todos modos) o laif
declaración para diferenciar entre dos casos que se pueden manejar de la misma manera al eliminar latoString()
llamada obsoleta :System.out.println(aField.getName() + ": " + res);
funciona, independientemente de si lores
esnull
o no. Y tampoco es necesario difundir el código en varios métodos…En REBOL, todas las variables viven dentro de un contexto de tipo
object!
. Hay un contexto global y cada función tiene su propio contexto local implícito. Puede crear nuevos contextos explícitamente creando un nuevoobject!
(o usando lacontext
función). Esto es diferente de los lenguajes tradicionales porque las variables (llamadas "palabras" en REBOL) llevan consigo una referencia a su contexto, incluso cuando han abandonado el "ámbito" en el que fueron definidas.Entonces, la conclusión es que, dado un contexto, podemos enumerar las variables que define. Usaremos la
context-words?
función de Ladislav Mecir .Ahora podemos enumerar todas las palabras definidas en el contexto global. (Hay muchos de ellos).
También podemos escribir una función que luego enumere las variables que define.
Lo que no podemos hacer en REBOL, que yo sepa, es subir por el árbol de contexto, aunque el intérprete parece ser capaz de hacerlo perfectamente bien cuando decide cómo unir las palabras a sus contextos. Creo que esto se debe a que el árbol de contexto (es decir, el alcance) puede tener una "forma" en el momento en que se enlaza una palabra, pero otra muy distinta en el momento en que se evalúa.
fuente
Solución de JavaScript rápida y sucia si tiene FireBug instalado (u otro navegador con console.log). Si no lo hace, tendrá que cambiar console.log a document.write y ejecutar en como un script en línea al final de su. Cambie MAX_DEPTH a la cantidad de niveles de recursividad que desee (¡tenga cuidado!).
fuente
Lisp común:
Para mostrar también todos los valores vinculados:
Esta es una lista larga y no particularmente útil. Realmente usaría el depurador integrado.
fuente
Aquí tienes una idea para oo-languages.
Primero necesita algo como toString () en Java para imprimir contenido significativo. En segundo lugar, debe limitarse a una jerarquía de objetos. En el constructor del objeto raíz (como Any en Eiffel), registra la instancia al crearse en algún tipo de lista global. Durante la destrucción, cancela el registro (asegúrese de utilizar alguna estructura de datos que permita una rápida inserción / búsqueda / eliminación). En cualquier momento durante la ejecución del programa, puede recorrer esta estructura de datos e imprimir todos los objetos registrados allí.
Debido a su estructura, Eiffel podría ser muy bueno para este propósito. Otros lenguajes tienen problemas con objetos que no están definidos por el usuario (por ejemplo, las clases jdk). En Java, podría ser posible crear su propia clase de objeto utilizando algún jdk de código abierto.
fuente