7
votes

La déclaration de fonction dans Python d'avoir un code lisible et propre?

est-il possible de déclarer des fonctions en python et de les définir plus tard ou dans un fichier séparé?

J'ai du code comme: xxx

Le problème est que le problème est que Le code devient désordonné et difficile à lire. Donc, je me demande s'il est possible de déclarer Func1 Intérieur Méthode1 et définissez-le plus tard?


1 commentaires

Si le fonctionnement Func1 () n'est vraiment pertinent qu'à la méthode1 (), et la méthode interne vous pose problème, c'est une indication qu'il devrait vraiment être une classe distincte.


5 Réponses :


2
votes

La définition interne crée un nom distinct dans la portée intérieure. Il sera ombragé tout ce que vous définissez plus tard avec le même nom. Si vous voulez définir la fonction ultérieurement, faites simplement. Le nom ne sera vérifié que lorsqu'il est réellement utilisé.

def foo():
  print 'foo'
  bar()

def bar():
  print 'bar'

foo()


0 commentaires

6
votes

Bien sûr, pas de problème:

foo.py: xxx

script.py: xxx


6 commentaires

Belle pensée! Cependant, l'idée d'une fonction locale est de rendre cette fonction utilisable uniquement à l'intérieur de la portée intérieure. Donc, quel est le point de définir le nouveau Func1 Intérieur Méthode1 ? Ne serait pas plus facile à faire: de FOO importer func1 et l'utiliser.


@Banx: la réponse de Alex Martelli ici ( Stackoverflow.com/questions/17444258/... ) m'a persuadé d'éviter de FOO Import Func1 entièrement.


@Banx: Oui, mettez la définition de Func1 INTÉRIEUR METHODY1 Le rend au moins semi-privé, bien que je ne le mettriez pas au-delà d'un pirate d'exploitation entreprenant Bytecode ( Stackoverflow .Com / Questions / 3908335 / ... ) Pour trouver un moyen de faire ce que vous pensez être privé non si-privé.


@Banx: Toutefois, si vous voulez une demi-vie privée, votre meilleur choix est de définir la méthode Func1 à l'intérieur1. Vous pouvez importer une chaîne et exécuter exécuté dessus ou utilisez le piratage bytecode pour injecter Func1 dans la méthode1, mais le premier pourrait être très mauvais pour la performance et aucune de ces options ne favorisera un code propre et lisible.


@Buntu: La réponse de Alex Martelli me persua aussi, merci pour le lien! Pensez-vous qu'il serait préférable d'appeler l'instruction Importer Inside Méthode1 comme suggéré par @Intué (au cas où aucune autre fonction n'est nécessaire de FOO ).


@Banx: Je ne m'inquiéterais pas de l'implication de la performance tant qu'il n'a pas été démontré que importer FOO est le goulot d'étranglement. Le guide de style Pep8 ( python.org/dev/peps/pep-0008) Les exigions «les importations sont toujours placées au sommet du dossier» et je pense que c'est une bonne pratique, car il indique clairement les dépendances totales de votre module ou de votre programme.



3
votes

Je pense que ce que vous voulez, c'est d'importer la fonction dans Méthode1 CODE>, E.G.

import other_module

# various codes

def method1(other_args, func=other_module.func1)
    # do stuff
    something = func(stuff, more_stuff)
    # do more stuff


0 commentaires

2
votes

Si Func1 () doit gérer tout ce qui est contentit dans la portée de la méthode1 (), vous avez la meilleure définition de Func1 (). Vous devrez avoir Func1 () recevoir des données pertinentes comme paramètres s'il n'est pas défini dans le cadre de la méthode1 ()


1 commentaires

+1 Parce que les fonctions imbriquées directement d'accéder directement aux noms de leur portée contenant sont un idiome important dans Python. Il est actuel que les règles de scopage sont très puissantes et bien pensées - voir [PPE 227 - Scopes nichées statiquement imbriquées (TTP: //www.python.org/dev/peps/pep-0227/) introduit dans Python 2.1. Mettre en place des définitions dans un fichier séparé empêcherait actuellement cela à moins d'être travaillé en quelque sorte.



0
votes

Vous pouvez créer des méthodes après xxx

Cependant, il n'est pas possible d'avoir une fonction anonyme (bien, il y a des expressions Lambda, mais vous ne pouvez pas avoir de relevés), vous devez donc vous fournir temporaire Nom

Vous voudrez peut-être utiliser des décorateurs afin de le rendre plus lisible: xxx

Ce code devrait être plus lisible. Il va toujours polluer le mannequin, mais l'initialisera avec NULL.


0 commentaires