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 № 1To, 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)