En raison de ma compréhension actuelle de la syntaxe de Python, j'ai eu une question dans laquelle j'ai besoin de définir une variable à une valeur mais sans utiliser aucun opérateur. Je dois utiliser des fonctions.
considérer ce sénario p> L'avantage de la définition de variables comme ceci est que l'ajout d'une nouvelle variable ne nécessite pas de copier et de coller un tas de Code de vérification pour la nouvelle méthode Setter. Il est plus modulaire. Le problème est qu'un tel programme ne fonctionne pas car Lambdas ne peut pas utiliser les opérateurs. P> L'erreur est Ce n'est pas la syntaxe appropriée. Afin d'exécuter un programme comme celui-ci, j'ai besoin d'une sorte de méthode équitable qui fait exactement la même chose que l'opérateur =. La mise en œuvre fonctionnerait comme suit. P> existe une méthode intégrée en Python pour le faire, si seulement pour les cordes? Sinon, une méthode peut-elle être facilement écrite? Celui qui peut prendre une variable comme entrée et définir cette variable forte> exacte forte> à une nouvelle valeur, et non une copie locale de celle-ci? P> p> self.set_global_variable (lambda new_x: self.x code> -> < code> = code> <-
new_x, val) code> p>
3 Réponses :
Vous pouvez utiliser Cependant, je vois que vous créez un seigter qui fait la propriété global code> pour cela, comme celui-ci:
y < / Code> Une valeur globale, ce qui signifie que vous ne pouvez avoir que 1 (significatif) objet OP le scénario de type. p> p>
Existe-t-il une façon de généraliser cela à toute variable d'une fonction. Ex. SET (VARNAME: STR): Global Varname; varname = "fantastique"?
La solution la plus simple peut être d'utiliser une fonction locale qui exécute l'affectation, comme suit: Cependant, si vous souhaitez utiliser une expression Lambda, vous pouvez essayer d'utiliser le une solution plus générale pourrait être de transmettre le nom de champ sur le setattr code>
fonction intégrée de Python, qui Fait savoir ce que vous avez demandé: p> set_global_variable code> et utiliser
setattr Code> Pour effectuer l'affectation, comme suit: p>
Il m'a fallu un peu pour comprendre Setattr mais oui c'est ce que je cherche. Essentiellement x = 3 est identique à SETATTR (Soi, "x", 3) non?
@Knobpersonal no. x = 3 code> Définit une variable dans la portée Whateer Vous êtes. Seattr Définit un attribut sur un objet b>
Oups Yep alors être à l'intérieur d'une classe avec la variable de la première place est important. Sinon, cela ne fonctionnera pas.
J'ai ajouté une référence à la SETATTRTTR intégrée. Essentiellement, setattr (auto, "x", 3) code> est le même de
self.x = 3 code>.
Si vous souhaitez une affectation plus générale, également aux variables locales (pour une raison quelconque), la première solution avec la fonction locale _set_variable code> n'a aucune limitation sur le type d'opérations que vous pouvez effectuer à l'intérieur.
Honnêtement c'est assez simple. En fait, j'ai posé une question similaire sur Java par an, il y a donc (des raisons similaires de ne pas vouloir répéter le code) et le code final nécessitait deux classes supplémentaires et une réflexion. C'est parfait.
Oui, mais la première option me demande encore de retaper chaque fois que j'ajoute une nouvelle variable correcte? Pour moi, la deuxième solution semble meilleure. Merci pour votre participation!
Donc, vous utilisez le terme sorties: p> note, ceci peut être réutilisé dans divers classes, et est très flexible si vous souhaitez modulariser. Et regardez combien nettoyeur em> le code client est, si vous souhaitez définir un attribut avec votre logique, vous venez de faire Remarque, Voir le Descripteur HOWTO P> P> global code> de manière incorrecte, vous essayez simplement de définir dynamiquement un attribut. Cela peut être accompli avec
setattr code>, cependant, ce que vous êtes effectivement em> tenter d'accomplir est d'encapsuler la logique de réglage. Python a le protocole descripteur. Voici comment vous feriez quelque chose comme ça dans Python:
auto.atribute = valeur code>, de la même manière, si vous voulez Obtenez un attribut, vous venez de faire
auto.Attribute code>. Pas laide
set_attribute () code> et
get_attribute () code> partout sur la place p>
Propriété code> Les objets ne sont que des descripteurs, donc sont
ClassMethod code> et
staticmethod code> décorateurs. En réalité, les objets de fonction em> ne sont que des descripteurs, dont
__ obtenez __ code> méthode s'appliquent essentiellement partiellement l'instance comme premier argument à lui-même. P>
Techniquement, la réponse que j'ai marquée comme correcte était plus pertinente pour la manière dont j'essayais de résoudre le problème, je pense que cette approche totalement nouvelle mérite également de vérifier. Mon projet a un backend que je code et une extrémité frontale que le code des utilisateurs, donc cela vous faciliterait beaucoup plus facilement. Malgré tout, je n'aime pas comment vous ne faites plus face à des cordes, mais des objets de cours. Néanmoins, +1 à cette réponse!
@Knobpersonal Non, vous avez affaire à des cordes. AVIS, j'ai passé des chaînes: Nom de membre ("Juan", "Arrivillaga") Code> et Remarque, les chaînes sont des objets de classes aussi ...
Je suis sûr que vous voulez
setaTtr code> mais votre question n'est pas vraiment claire pour moi. Remarque, vous pouvez simplement simplement utiliser
Lambda CODE> Expressions et des énoncés de définition de fonction régulière, qui permettent des relevés d'affectation.
Qu'est-ce que
set_global_variable code> est censé faire? Il looks i> comme vous voulez réellement définir une variable d'instance, encore une fois, votre exemple est très déroutant
"L'avantage de la définition de variables comme ceci est que l'ajout d'une nouvelle variable ne nécessite pas de copier et de coller un code de vérification de la nouvelle méthode de réglage." Pouvez-vous donner un exemple de ce que vous essayez exactement d'éviter? Il existe probablement de meilleurs moyens d'accomplir ce que vous essayez de faire en python, par exemple, écrire un descripteur personnalisé pour modulariser la logique de réglage.
Ah je viens de Java où toutes vos variables doivent être dans une classe, donc je reçois beaucoup de variables mondiales et une variable d'instance confuse beaucoup. L'idée principale est que je veux généraliser une fonction de réglage que je peux facilement réutiliser avec toutes mes variables
Noi pensée eq b> retourne un booléen @AlexanderleKontsev
Vous recherchez
setaTtr code>, si vous souhaitez définir de manière dynamique un attribut. Cependant, comme je l'ai dit, vous presque certainement b> réinventez la roue et ne profitez pas des constructions de langues qui vous permettraient de le faire plus sur le plan idiomatique.
Je suis assez nouveau à Python afin qu'il y ait une meilleure façon de le faire. Je pense que Satattr travaille pour mon cas particulier mais n'y a-t-il vraiment aucune méthode pour l'opérateur =?
Non, il n'y a pas. Eh bien, cela dépend si vous êtes définir un attribut i>, il y a, si vous utilisez
my_obj [item] = valeur code> Il y a
__ setiitem __ code>, mais simplement,
x = 3 code> n'affecte pas l'objet b>, qui lie juste un nom dans une portée, globale, local