/ / Jak mogę interpolować zmienne w heredokach Pythona? - python, heredoc, interpolacja łańcuchowa

Jak mogę interpolować zmienne w heredoc Pythona? - python, heredoc, interpolacja ciągów znaków

W językach Perla mogę interpolować w podwójnie cytowanych heredocach:

Perl:

#!/bin/env perl
use strict;
use warnings;

my $job  = "foo";
my $cpus = 3;

my $heredoc = <<"END";
#SBATCH job $job
#SBATCH cpus-per-task $cpus
END

print $heredoc;

Rakudo Perl 6:

#!/bin/env perl6

my $job  = "foo";
my $cpus = 3;

my $heredoc = qq:to/END/;
#SBATCH job $job
#SBATCH cpus-per-task $cpus
END

print $heredoc;

Jak zrobić coś podobnego w Pythonie? Podczas przeszukiwania „interpolacji łańcucha heredoc Python” natknąłem się na informacje o f-stringach Pythona, które ułatwiają interpolację łańcuchów (dla Pythona 3.6 i późniejszych).

Python 3.6+ z ciągami znaków:

#!/bin/env python3

job  = "foo"
cpus = 3
print(f"#SBATCH job {job}")
print(f"#SBATCH cpus-per-task {cpus}")

Wszystkie trzy z powyższych dają dokładnie takie samo wyjście:

#SBATCH job cutadapt
#SBATCH cpus-per-task 3

To wszystko jest miłe i wszystko, ale wciąż bardzo interesuje mnie interpolacja heredocs przy użyciu Pythona.

Odpowiedzi:

6 dla odpowiedzi № 1

To, co większość ludzi nazywa „heredokami”, nazywane jest w Pythonie „potrójnymi ciągami znaków”. Po prostu musisz utworzyć potrójnie cytowany f-string:

#!/bin/env python3

cpus = 3
job  = "foo"
print(f"""
#SBATCH job {job}
#SBATCH cpus-per-task {cpus}""")

Jak już wcześniej zauważyłeś, jest to specyficzne dla Pythona 3.6 i późniejszych.


Jeśli chcesz zrobić coś więcej niż tylko interpolację zmiennych, ciągi f zapewniają również ocenę kodu wewnątrz nawiasów klamrowych:

#!/bin/env python3
print(f"5+7 = {5 + 7}")
5+7 = 12

Jest to bardzo podobne do podwójnie cytowanych ciągów w Perlu 6:

#!/bin/env perl6
put "5+7 = {5 + 7}";
5+7 = 12

4 dla odpowiedzi nr 2

Dla potrzeb rekordu, inne opcje formatowania napisów w Pythonie działają również dla ciągów potrójnie cytowanych z wieloma wierszami:

a = 42
b = 23

s1 = """
some {} foo
with {}
""".format(a, b)

print(s1)

s2 = """
some %s foo
with %s
""" % (a, b)

print(s2)