8
votes

Syntaxe bizâmes ou pourquoi est-ce que ce python valide

dans Python 2.6, pourquoi la ligne suivante est-elle valide?

foo = 'foo'
bar = 'bar'
foo_bar = foo bar


4 commentaires

Je ne vois pas le point dans "Supprimer" les espaces blancs comme votre my_list = 1 2 semble suggérer.


Cela ne suggère pas cela. Ce que je suggère, c'est que cet aspect de la syntaxe Python est incompatible (IMHO).


Voir ce PEP python.org/dev/peps/pep-3126 où Il est largement discuté.


Dans n'importe quelle langue, je soupçonne que 5 * 10 est valide mais "foo" * "bar" n'est pas. Est-ce que cela rend la langue incompatible? Même si oui, qu'est-ce que cela compte?


4 Réponses :


8
votes

my_line = 'foo' '' bar ' est la concaténation de chaînes.


9 commentaires

@Ipthnc moi aussi. Heureusement, je n'ai pas rencontré de code écrit de cette façon, et j'espère que je n'ai jamais besoin de ... je suis sûr que j'oublierai ce que tu veux dire!


Cela pourrait être utile lorsque le code de «génération automatique», mais en dehors de cela, je ne parviens pas à voir l'avantage (le cas échéant).


C et C ++ Faites cela aussi. Je ne connais pas de très bonne raison pour Python d'avoir le même ennemi. Dans ce cas particulier, 'FOO' + 'BAR' compile exactement le même bytecode, mais IIRC Le compilateur bytecode n'est pas TOUJOURS ADD de chaîne de pli constant.


Cela ressemble fondamentalement à une opération est effectuée (String Concat) sans utiliser d'opérateur ni de fonctionnement. Je sais que c'est un python valide, mais je ne peux pas imaginer pourquoi quiconque voudrait cela, encore moins de travailler sur des types autres que des cordes.


Lors de la génération de code Python par programme, émettez le fragment "fragment1" semi-indépendamment à partir d'un autre fragment "fragment" sur la même ligne est plus facile que de suivre un autre état dans un FSM pour tenir compte du littéral à chaîne ouverte.


@Jason, je crois que c'est faux, car cela se fait au moment de la compilation, pas de temps d'exécution. Voir mes réponses pour un lien qui montre de bonnes raisons d'avoir cette fonctionnalité.


C'est ainsi que vous pouvez rompre des chaînes sur plusieurs lignes. Vous pouvez faire quelque chose comme my_str = ("une chaîne vraiment longue qui est difficile à tenir sur une ligne" \ n "associée à une autre chaîne vraiment longue sur une autre ligne." ) (ne peut pas faire de formatage correct Dans les commentaires, mais imaginez que couvre deux lignes.) Il est en fait assez utile et assez courant dans le code source Python. Pour ce que cela vaut, C / C ++ permet au même type de concaténation automatique de chaînes.


@jldupont, un côté bas des chaînes triples-citées est qu'ils incluent des espaces blancheurs de toute indentation. Cela vous obligerait souvent à aligner tout en eux, ce qui peut souvent briser le "flux" du code pour le lecteur. J'utilise des chaînes triples-citées pour les constantes multilignes, définies en dehors des classes ou des fonctions, mais à l'intérieur de l'autre, je préfère habituellement l'approche de la concatage des chaînes.


@Peter Hansen: Cela a du sens. Je me souviens d'avoir utilisé Docstrings de manière non conventionnelle dans le passé et je devais faire "édition sur la mouche" mais j'ai choisi Docstring quand même parce qu'ils sont plus faciles à lire. Je suppose qu'il y a de nombreuses façons de cuire un chat.



20
votes

Cela fait Corder la concaténation littérale . Comme indiqué dans la documentation, les avantages sont les suivants:

Cette fonctionnalité peut être utilisée pour réduire la Nombre de backslashes nécessaires, à scinder longs cordes commodément à travers longtemps lignes, voire d'ajouter des commentaires à parties de cordes ...

On notera que cette concaténation se fait au temps de compilation plutôt que le temps d'exécution.

L'historique et la raison d'être derrière cela, et une suggestion rejetée pour supprimer la fonctionnalité est décrite dans PEP 3126 .


0 commentaires

5
votes

Ce n'est pas incompatible. Les chaînes et les entiers ont des méthodes différentes.

La concaténation entière n'a pas de sens.

La concaténation de la chaîne est un comportement par défaut significatif.


0 commentaires

6
votes

Peut-être que c'est de l'ascendance de C. En C, ce qui suit est parfaitement valide: xxx

Il est implémenté par le C Pré-processeur (CPP) et la justification donnée dans ce lien est la suivante:

Ceci permet aux longues chaînes d'être scindées sur plusieurs lignes, et permet également littéraux de chaîne résultant de c Le préprocesseur définit et les macros à être annexée aux chaînes à la compilation


0 commentaires