如何在Python heredocs中插入变量?

Chr*_*oms 2 python heredoc string-interpolation

在Perl语言中,我可以用双引号heredocs进行插值:

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

我如何在Python中做类似的事情?在搜索"heredoc字符串插值Python"时,我确实遇到了有关Python f字符串的信息,这有助于字符串插值(适用于Python 3.6及更高版本).

带有f-strings的Python 3.6+:

#!/bin/env python3

job  = 'foo'
cpus = 3
print(f"#SBATCH job {job}")
print(f"#SBATCH cpus-per-task {cpus}")
Run Code Online (Sandbox Code Playgroud)

以上所有三个都产生完全相同的输出:

#SBATCH job cutadapt
#SBATCH cpus-per-task 3
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是我仍然对使用Python的heredocs插值感兴趣.

Chr*_*oms 6

大多数人称之为"heredocs"的东西在Python中称为"三重引用字符串".您只需要创建一个三引号f字符串:

#!/bin/env python3

cpus = 3
job  = 'foo'
print(f'''\
#SBATCH job {job}
#SBATCH cpus-per-task {cpus}''')
Run Code Online (Sandbox Code Playgroud)

但是,如前所述,这是Python 3.6及更高版本所特有的.


如果你想做的不仅仅是内插变量,f-strings还提供花括号内代码的评估:

#!/bin/env python3
print(f'5+7 = {5 + 7}')
Run Code Online (Sandbox Code Playgroud)
5+7 = 12
Run Code Online (Sandbox Code Playgroud)

这与Perl 6中的双引号字符串非常相似:

#!/bin/env perl6
put "5+7 = {5 + 7}";
Run Code Online (Sandbox Code Playgroud)
5+7 = 12
Run Code Online (Sandbox Code Playgroud)


mor*_*itz 6

仅作记录,Python中的其他字符串格式设置选项也适用于多行三重引用的字符串:

a = 42
b = 23

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

print(s1)

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

print(s2)
Run Code Online (Sandbox Code Playgroud)