0
votes

Y a-t-il une fonction dans Python qui fait la même chose que l'opérateur égal à

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 xxx

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.

L'erreur est self.set_global_variable (lambda new_x: self.x -> < code> = <- new_x, val)

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. xxx

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 exacte à une nouvelle valeur, et non une copie locale de celle-ci?


8 commentaires

Je suis sûr que vous voulez setaTtr mais votre question n'est pas vraiment claire pour moi. Remarque, vous pouvez simplement simplement utiliser Lambda 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 est censé faire? Il looks 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 retourne un booléen @AlexanderleKontsev


Vous recherchez setaTtr , si vous souhaitez définir de manière dynamique un attribut. Cependant, comme je l'ai dit, vous presque certainement 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 , il y a, si vous utilisez my_obj [item] = valeur Il y a __ setiitem __ , mais simplement, x = 3 n'affecte pas l'objet , qui lie juste un nom dans une portée, globale, local


3 Réponses :


0
votes

Vous pouvez utiliser global pour cela, comme celui-ci: xxx

Cependant, je vois que vous créez un seigter qui fait la propriété y < / Code> Une valeur globale, ce qui signifie que vous ne pouvez avoir que 1 (significatif) objet OP le scénario de type.


1 commentaires

Existe-t-il une façon de généraliser cela à toute variable d'une fonction. Ex. SET (VARNAME: STR): Global Varname; varname = "fantastique"?



1
votes

La solution la plus simple peut être d'utiliser une fonction locale qui exécute l'affectation, comme suit: xxx

Cependant, si vous souhaitez utiliser une expression Lambda, vous pouvez essayer d'utiliser le setattr fonction intégrée de Python, qui Fait savoir ce que vous avez demandé: xxx

une solution plus générale pourrait être de transmettre le nom de champ sur le set_global_variable et utiliser setattr Pour effectuer l'affectation, comme suit: xxx


7 commentaires

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 Définit une variable dans la portée Whateer Vous êtes. Seattr Définit un attribut sur un objet


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) est le même de self.x = 3 .


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 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!



1
votes

Donc, vous utilisez le terme global de manière incorrecte, vous essayez simplement de définir dynamiquement un attribut. Cela peut être accompli avec setattr , cependant, ce que vous êtes effectivement 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: xxx

sorties: xxx

note, ceci peut être réutilisé dans divers classes, et est très flexible si vous souhaitez modulariser. Et regardez combien nettoyeur le code client est, si vous souhaitez définir un attribut avec votre logique, vous venez de faire auto.atribute = valeur , de la même manière, si vous voulez Obtenez un attribut, vous venez de faire auto.Attribute . Pas laide set_attribute () et get_attribute () partout sur la place

Remarque, Propriété Les objets ne sont que des descripteurs, donc sont ClassMethod et staticmethod décorateurs. En réalité, les objets de fonction ne sont que des descripteurs, dont __ obtenez __ méthode s'appliquent essentiellement partiellement l'instance comme premier argument à lui-même.

Voir le Descripteur HOWTO


2 commentaires

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") et Remarque, les chaînes sont des objets de classes aussi ...