web-dev-qa-db-fra.com

syntaxe de chaîne f pour décompresser une liste avec suppression d'accolades

J'ai examiné certaines de mes options de format de chaîne en utilisant le nouveau format de chaîne f. J'ai régulièrement besoin de déballer des listes et autres itérables de longueur inconnue. Actuellement j'utilise ce qui suit ...

>>> a = [1, 'a', 3, 'b']
>>> ("unpack a list: " + " {} "*len(a)).format(*a)
'unpack a list:  1  a  3  b '

Ceci, quoique un peu lourd, fait le travail en utilisant la notation .format pré-3.6. La nouvelle option de format de chaîne f est intéressante compte tenu de la concaténation des chaînes d'exécution. C'est la réplication du nombre de {} avec laquelle j'ai des problèmes. Dans mon exemple précédent, j'ai simplement créé la structure nécessaire et décompressé dans la section .format ().

Les tentatives pour ce faire ont cependant produit une variante qui a fonctionné:

1) Les deux accolades ne déballent pas ensemble ...

>>> 'unpack a list'  f' {{*a}}'
'unpack a list {*a}'

2) Ajout d'espaces autour de la paire {} intérieure:

Cela fonctionne mais laisse les accolades ouvrantes et fermantes {,} présentes:

>>> 'unpack a list'  f' { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"

2b) Concaténation des variantes en une seule chaîne f

Cela a amélioré l'apparence et la syntaxe, car l'évaluation, apparemment, se fait de gauche à droite. Cela, cependant, laissait toujours les accolades fermées:

>>> f'unpack a list { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"

3) Déballage automatique essayé avec juste {a}

Peut-être que je repensais à toute la procédure et espérais une forme de déballage automatique. Cela a simplement produit la représentation de la liste avec les accolades remplacées par []:

>>> f'unpack a list {a}'
"unpack a list [1, 'a', 3, 'b']"

Que faut-il pour supprimer les accolades dans la variante (2) ci-dessus, ou dois-je continuer à utiliser la méthode .format() existante? Je veux rester simple et utiliser les nouvelles capacités offertes par la chaîne f et ne pas revenir au-delà des versions python qui sont antérieures à ce avec quoi je suis actuellement à l'aise. Je commence à soupçonner que f'strings 'n'offre pas une couverture complète de ce qui est offert par son frère .format(). Je vais en rester là pour l'instant, car je ne me suis même pas aventuré dans l'encodage d'échappement et l'incapacité de utiliser\dans une f-chaîne. J'ai lu le PEP et recherche largement, cependant, je sens que je manque l'évidence ou ce que je souhaite n'est actuellement pas possible.

MODIFIER plusieurs heures plus tard:

4) Utilisez l'indexation pour couper manuellement les crochets: str(a)[1:-2]

J'ai trouvé cette variante qui servira dans certains cas dont j'ai besoin

f'unpack a list: {str(a)[1:-2]}'
"unpack a list: 1, 'a', 3, 'b"

Mais le découpage n'est guère plus qu'une commodité et laisse toujours les guillemets de chaîne autour de la résultante.

16
NaN

Étant donné que toute expression Python expression valide est autorisée à l'intérieur des accolades dans une chaîne f, vous pouvez simplement utiliser str.join() pour produire le résultat souhaité:

>>> a = [1, 'a', 3, 'b']
>>> f'unpack a list: {" ".join(str(x) for x in a)}'
'unpack a list: 1 a 3 b'

Vous pouvez bien sûr également écrire une fonction d'aide, si votre cas d'utilisation réel rend les informations ci-dessus plus verbeuses que vous ne le souhaiteriez:

def unpack(s):
    return " ".join(map(str, s))  # map(), just for kicks
>>> f'unpack a list: {unpack(a)}'
'unpack a list: 1 a 3 b'
17
Zero Piraeus

Je ne pense pas que c'est la façon dont les f-strings sont censés être utilisés. Au mieux, je peux imaginer préparer un tuple compatible avec print (), comme:

mixed = [1, "list_string", 2]
number = 23
answer = 46

info = 'Content:', *mixed, f'{number} {answer}'
print(*info)  # default sep=' '

Production

Content: 1 list_string 2 23 46
1
Ernesto Herrera

Simple Python est probablement plus clair:

>>>  'unpack a list: ' + ' '.join(str(x) for x in a)
'unpack a list: 1 a 3 b'

Avec tranchage:

>>> 'unpack a list: ' + ' '.join([str(x) for x in a][1:3])
'unpack a list: a 3'
1
Gringo Suave