Connexes: % et str.format () en Python. Lequel utilisez-vous?
Il y avait une mention de f-strings ci-dessus, mais je pense que ce n'est pas le seul moyen de le convertir en chaînes. Voici quelques éléments qui me viennent à l'esprit sous forme de mémos.
>>> import datetime
>>> d = datetime.datetime(2017, 9, 1, 12, 12, 0, 0)
>>> str(d)
'2017-09-01 12:12:00'
>>> repr(d)
'datetime.datetime(2017, 9, 1, 12, 12)'
>>> eval(repr(d))
datetime.datetime(2017, 9, 1, 12, 12)
repr (obj)
appelle en interne ʻobj .__ repr__ () , et
str (obj) implémente en interne ʻobj .__ str__ ()
, sinon ʻobj. repr () ʻest appelé et utilisé à la place.
Le résultat de repr (obj)
devrait être une expression Python si possible, mais ce n'est pas toujours le cas. L'exemple datetime ci-dessus renvoie une chaîne qui peut être évaluée avec ʻeval () `.
Il n'est pas nécessaire que le résultat de str (obj)
soit une expression Python, et il est courant de donner la priorité à un format lisible par l'homme.
Quand vous dites "convertir un objet en une chaîne facile à lire", vous pouvez penser, par exemple, au module pprint
. Il semble qu'il utilise ʻobj .__ repr__ () . Eh bien, il est impossible de saisir la structure à partir du résultat de
__str __ ()`.
str.format ()
C'était le sujet de l'article ci-dessus. Je pense que c'est le plus important dans le développement quotidien, mais il est omis.
f-strings
Une notation introduite dans Python 3.6 qui vous permet d'écrire des expressions Python directement dans une chaîne.
PEP 498 -- Literal String Interpolation
Un exemple de FizzBuzz.
>>> print(*[f"{'Fizz'*(not i%3)}{'Buzz'*(not i%5)}" or i for i in range(1,31)], sep='\n')
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
Je me réfère au "[un oneliner Py3.6 fizzBuzz avec f-strings] de Reddit (https://www.reddit.com/r/Python/comments/5k7lnb/a_py36_fizzbuzz_oneliner_with_fstrings/)", mais map ()
Je l'ai changé pour la notation d'inclusion de liste car il semble être plus confortable récemment (reduction ()
a peut-être laissé tomber la bibliothèque).
Par mesure de sécurité, le «*» au début de l'argument «print ()» indique le déballage de la liste.
En termes de vérification de type, au moins mypy 0.521 regarde à l'intérieur des f-strings.
$ mypy --version
mypy 0.521
$ cat /tmp/test.py
def func(a: int) -> int:
return a ** 2
print(f'{func(10.0)}')
$ python /tmp/test.py
100.0
$ mypy /tmp/test.py
/tmp/test.py:4: error: Argument 1 to "func" has incompatible type "float"; expected "int"
Malheureusement, j'utilise souvent la version 3.5 ou antérieure, je n'ai donc pas pris l'initiative de l'unifier.
Cependant, dans le futur, je pense qu'il y a une possibilité que les f-strings deviennent le centre, en surmontant str.format ()
.
[https://docs.python.jp/3/library/string.html#template-strings](chaîne de modèle)
Il existe une fonctionnalité Python intégrée pour les chaînes de modèle qui remplace la $ variable
en tant qu'ancienne fonctionnalité. Je présenterai brièvement l'exemple ci-dessus.
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
Malheureusement, l'échappement HTML, etc. n'est pas pris en charge. Je le vois rarement personnellement, mais j'ai envisagé de l'utiliser.
Le titre en dit six, mais il existe encore des fonctionnalités Python standard.
pprint
format ()
(Commentée. Je ne savais pas. Référence)Il devrait y avoir d'autres façons de le convertir en chaîne à l'aide d'une bibliothèque externe telle que jinja2. Bien sûr, si vous le faites vous-même, vous aurez plus de choix.
Recommended Posts