¿Es posible declarar hacia adelante una función en Python? Quiero ordenar una lista usando mi propia cmp
función antes de declararla.
print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])
He organizado mi código para poner la definición del cmp_configs
método después de la invocación. Falla con este error:
NameError: name 'cmp_configs' is not defined
¿Hay alguna forma de "declarar" el cmp_configs
método antes de usarlo? ¿Haría que mi código se vea más limpio?
Supongo que algunas personas se verán tentadas a decirme que debería reorganizar mi código para no tener este problema. Sin embargo, hay casos en que esto es inevitable, por ejemplo, cuando se implementan algunas formas de recursión. Si no le gusta este ejemplo, suponga que tengo un caso en el que es realmente necesario reenviar la declaración de una función.
Considere este caso donde sería necesario declarar hacia adelante una función en Python:
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Dónde end_condition
y end_result
se han definido previamente.
¿Es la única solución para reorganizar el código y siempre poner definiciones antes de las invocaciones?
fuente
main()
?import your_module
Lo que puede hacer es envolver la invocación en una función propia.
Así que eso
se romperá, pero
funcionará correctamente
La regla general en no
Python
es que la función deba definirse más arriba en el código (como en ), sino que debe definirse antes de su uso.Pascal
Espero que ayude.
fuente
if __name__=="__main__":
solución.Si inicia su secuencia de comandos a través de lo siguiente:
entonces probablemente no tenga que preocuparse por cosas como la "declaración de reenvío". Verá, el intérprete cargaría todas sus funciones y luego iniciaría su función main (). Por supuesto, asegúrese de tener todas las importaciones correctas también ;-)
Ahora que lo pienso, nunca he escuchado algo así como "declaración directa" en Python ... pero, de nuevo, podría estar equivocado ;-)
fuente
Si la llamada a cmp_configs está dentro de su propia definición de función, debería estar bien. Daré un ejemplo.
En general, poner su código dentro de las funciones (como main ()) resolverá su problema; simplemente llame a main () al final del archivo.
fuente
Pido disculpas por revivir este hilo, pero hubo una estrategia no discutida aquí que puede ser aplicable.
Usando la reflexión, es posible hacer algo similar a la declaración directa. Por ejemplo, supongamos que tiene una sección de código que se ve así:
Entonces, de esta manera, hemos determinado a qué función queremos llamar antes de que se defina realmente, efectivamente una declaración directa. En python, la declaración
globals()[function_name]()
es la misma quefoo()
si fuerafunction_name = 'foo'
por las razones discutidas anteriormente, ya que python debe buscar cada función antes de llamarla. Si uno usara eltimeit
módulo para ver cómo se comparan estas dos afirmaciones, tienen exactamente el mismo costo computacional.Por supuesto, el ejemplo aquí es muy inútil, pero si uno tuviera una estructura compleja que necesitara ejecutar una función, pero debe declararse antes (o estructuralmente tiene poco sentido tenerla después), uno puede almacenar una cadena y intente llamar a la función más tarde.
fuente
No hay tal cosa en Python como la declaración directa. Solo tiene que asegurarse de que su función se declare antes de que sea necesaria. Tenga en cuenta que el cuerpo de una función no se interpreta hasta que se ejecuta la función.
Considere el siguiente ejemplo:
Puede pensar que el cuerpo de una función es solo otro script que se interpretará una vez que llame a la función.
fuente
No, no creo que haya ninguna manera de declarar hacia adelante una función en Python.
Imagina que eres el intérprete de Python. Cuando llegas a la línea
o sabes lo que es cmp_configs o no. Para continuar, debe conocer cmp_configs. No importa si hay recurrencia.
fuente
A veces, un algoritmo es más fácil de entender de arriba a abajo, comenzando con la estructura general y profundizando en los detalles.
Puede hacerlo sin declaraciones a futuro:
fuente
Salida:
fuente
No puede declarar hacia adelante una función en Python. Si tiene una ejecución lógica antes de haber definido las funciones, de todos modos probablemente tenga un problema. Ponga su acción
if __name__ == '__main__'
al final de su secuencia de comandos (ejecutando una función que nombre "principal" si no es trivial) y su código será más modular y podrá usarlo como módulo si alguna vez necesita a.Además, reemplace esa comprensión de la lista con un generador express (es decir,
print "\n".join(str(bla) for bla in sorted(mylist, cmp=cmp_configs))
)Además, no use
cmp
, que está en desuso. Usekey
y proporcione una función menor que.fuente
Importa el archivo en sí. Suponiendo que el archivo se llama test.py:
fuente
"simplemente reorganice mi código para que no tenga este problema". Correcto. Fácil de hacer. Siempre funciona
Siempre puede proporcionar la función antes de su referencia.
"Sin embargo, hay casos en los que esto es inevitable, por ejemplo, cuando se implementan algunas formas de recursión".
No puedo ver cómo eso es remotamente posible. Proporcione un ejemplo de un lugar donde no pueda definir la función antes de usarla.
fuente
Ahora espera un minuto. Cuando su módulo alcanza la declaración de impresión en su ejemplo, antes de que
cmp_configs
se haya definido, ¿qué es exactamente lo que espera que haga?Si su publicación de una pregunta usando print realmente está tratando de representar algo como esto:
entonces no hay ningún requisito para definir
cmp_configs
antes de ejecutar esta declaración, simplemente defínalo más adelante en el código y todo estará bien.Ahora, si está intentando hacer referencia
cmp_configs
como valor predeterminado de un argumento a la lambda, esta es una historia diferente:Ahora necesita una
cmp_configs
variable definida antes de llegar a esta línea.[EDITAR - esta siguiente parte resulta no ser correcta, ya que el valor de argumento predeterminado se asignará cuando se compila la función, y ese valor se usará incluso si cambia el valor de cmp_configs más tarde].
Afortunadamente, a Python, que es tan adaptable a los tipos, no le importa lo que defina
cmp_configs
, por lo que podría prefacio con esta declaración:Y el compilador será feliz. Solo asegúrese de declarar lo real
cmp_configs
antes de invocarfn
.fuente
Una forma es crear una función de controlador. Defina el controlador desde el principio y coloque el controlador debajo de todos los métodos que necesita llamar.
Luego, cuando invoque el método del controlador para llamar a sus funciones, siempre estarán disponibles.
El manejador podría tomar una discusión
nameOfMethodToCall
. Luego usa un montón de sentencias if para llamar al método correcto.Esto resolvería tu problema.
fuente
Sí, podemos verificar esto.
Entrada
Salida
Como BJ Homer mencionó en los comentarios anteriores, una regla general en Python no es que la función deba definirse más arriba en el código (como en Pascal), sino que debe definirse antes de su uso.
Espero que ayude.
fuente
print_lyrics()
llama (usa) en la línea 1 antes de que se defina? Copié este código e intenté ejecutarlo, y me da el errorNameError: name 'print_lyrics' is not defined
en la línea 1. ¿Puede explicar esto?