長い複数行の文字列を作成するPythonの方法


1307

非常に長いクエリがあります。Pythonで数行に分割したいと思います。JavaScriptでそれを行う方法は、いくつかの文を使用してそれらを+演算子で結合することです(私は知っています、それはそれを行うための最も効率的な方法ではないかもしれませんが、この段階でのパフォーマンスについてはあまり心配していません、コードの読みやすさだけです) 。例:

var long_string = 'some text not important. just garbage to' +
                  'illustrate my example';

Pythonでも同様のことを試みましたが、うまくいきませんでしたので\、長い文字列を分割していました。ただし、これが唯一の/最良の/ Pythonicestの方法であるかどうかはわかりません。ぎこちなく見えます。実際のコード:

query = 'SELECT action.descr as "action", '\
    'role.id as role_id,'\
    'role.descr as role'\
    'FROM '\
    'public.role_action_def,'\
    'public.role,'\
    'public.record_def, '\
    'public.action'\
    'WHERE role.id = role_action_def.role_id AND'\
    'record_def.id = role_action_def.def_id AND'\
    'action.id = role_action_def.action_id AND'\
    'role_action_def.account_id = ' + account_id + ' AND'\
    'record_def.account_id=' + account_id + ' AND'\
    'def_id=' + def_id

207
あなたの例はインジェクション攻撃を待っているSQLブロックのように見えるので、別の提案は、SQLAlchemyなどの高レベルのSQLライブラリを調べて、このような生のSQLをハッキングしないようにすることです。(おそらくトピックから外れていますが、「任意の提案」を求めていました。;)
John Gaines Jr.

6
これは「長い文字列の複数行コードを作成するPythonの方法」です改行含む文字列を作成するには、textwrap.dedent 参照してください。
Bob Stein

8
@cezar私はこの質問を5年以上前に書きましたが、長いSQLクエリを適切に数行に配置する方法を知らなかったことが原因だったことを覚えています。私はその長い文字列で愚かなことをしていたのに同意しますが、それは私の質問ではなく、SQLインジェクションの懸念が含まれていないことを示すより良い例を探すほど賢くありませんでした。
Pablo Mescher

@cezarいいえ、これはXY問題ではありません。どのような場合でも、クエリは複数行でフォーマットするのが最適です。SQLiは当面の問題とは無関係です。ただし、大きな太字の警告は完全に正当化されます:)
bugmenot123

私はこれのために小さなパッケージを書きました。ここの例:stackoverflow.com/a/56940938/1842491
Shay

回答:


2229

複数行の文字列について話していますか?簡単に、三重引用符を使用して開始および終了します。

s = """ this is a very
        long string if I had the
        energy to type more and more ..."""

一重引用符(もちろん、開始と終了で3つ)を使用して、結果の文字列をs他の文字列と同じように扱うことができます。

:他の文字列と同様に、開始引用符と終了引用符の間は文字列の一部になるため、この例では(@ root45で指摘されているように)先頭に空白があります。この文字列には、空白と改行の両方が含まれます。

つまり、:

' this is a very\n        long string if I had the\n        energy to type more and more ...'

最後に、次のようにPythonで長い行を作成することもできます。

 s = ("this is a very"
      "long string too"
      "for sure ..."
     )

これには余分な空白や改行は含まれませ(これは空白をスキップするとどのような結果になるかを示す意図的な例です):

'this is a verylong string toofor sure ...'

カンマは必要ありません。結合する文字列を1組の括弧に入れ、必要な空白と改行をすべて考慮してください。


8
2番目の方法では、明示的に「+」演算子を使用することを好みます。それほど面倒ではなく、読みやすさが向上します。
Marco Sulla

38
@LucasMalor隣接する文字列は、コンパイル時の連結です。+演算子を使用して、実行時に連結を行わないのですか?
ジョシュアテイラー

13
参考までに、この現象の公式ドキュメントは次のとおりですdocs.python.org/2/reference/…(python 2)およびdocs.python.org/3/reference/…(python 3)
neverendingqs

4
あなたの例は良いですが、変数データをクエリに安全かつ確実に埋め込む方法を示すことが含まれていればいいのにと思います。OPと@jesseeのサンプルコードはどちらも、正しく実行しない方法を示しています(これらはSQL攻撃への招待です)。参照:dev.mysql.com/doc/connector-python/en/...
スコット・プリヴェ

2
textwrap.dedent不要な先頭の空白を削除するために使用できます。docs.python.org/3/library/textwrap.html#textwrap.dedent
Corey Goldberg

190

複数行の文字列が不要で、長い単一行の文字列がある場合は、かっこを使用できます。文字列セグメントの間にコンマを含めないようにしてください。タプルになります。

query = ('SELECT   action.descr as "action", '
         'role.id as role_id,'
         'role.descr as role'
         ' FROM '
         'public.role_action_def,'
         'public.role,'
         'public.record_def, '
         'public.action'
         ' WHERE role.id = role_action_def.role_id AND'
         ' record_def.id = role_action_def.def_id AND'
         ' action.id = role_action_def.action_id AND'
         ' role_action_def.account_id = '+account_id+' AND'
         ' record_def.account_id='+account_id+' AND'
         ' def_id='+def_id)

作成しているSQLステートメントでは、複数行の文字列も問題ありません。しかし、複数行の文字列に含まれる余分な空白が問題になる場合は、これが目的を達成するための良い方法です。


1
@Pabloの後にコメントを追加することもできます,
Ashwini Chaudhary

@ 200OK 'って意味?
kon psych 2014年

3
この文字列をフォーマットするもう1つの方法.format(...)は、閉じ括弧の後に追加することです。%フォーマット表記も機能するはずですが、私は試していません
kon psych

3
各行は文字列定数で終了する必要があるため' foo '+variable、機能しませんが機能し' foo '+variable+''ます。
ヨーヨー2015

46
この例は、SQLインジェクション攻撃への扉を開いています。誰もが一般公開アプリケーションでこれを使用しないでください。「プレースホルダ」を使用する方法については、MySQLのドキュメントを参照してください。dev.mysql.com/doc/connector-python/en/...
スコット・プリヴェ

138

\作品ごとに改行します。次に例を示します。

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"

9
三重引用符表記または()内でのラッピングのどちらかを\文字よりも優先します
Khanh Hua

15
次の行の末尾ではなく、次の行の先頭にスペースを置くことを強くお勧めします。このようにして、誤って行方不明になったものはより明白です(したがって、発生する可能性が低くなります)。
Alfe、

行末の変数でも機能しますlongStr = "account: " + account_id + \ ...
frmbelz

私は、次のエラーを取得しています:the backslash is redundant between brackets私は内側に書いたときprint()
アルパース

50

私はこれに満足しています:

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')

32
同意しない。最初の行( "string = ...")が大きくインデントされている場合はどうなりますか?次の行のインデントを0にすると、インデントされていないブロックの真ん中で醜く見えます。
xjcl 2017

1
まあ、私の長い文字列の大部分はモジュールレベルで発生しますが、これはうまく適合します。あなたの場合ではこれは明らかに最良の解決策ではありません。
Eero Aaltonen 2017

1
この方法が好きなのは、この方法が好きだからです。長い文字列がある場合、方法はありません...インデントのレベルに応じて、1行あたり80文字に制限されます...ええと...他に何も言う必要はありません。私の見解では、Pythonスタイルガイドはまだ非常にあいまいです。ありがとう!
Eduardo Lucio 2017年

それはモジュールの下で使用されている場合、これは私もように持っているので、醜いだろう.replace('\t','')
アルパース

44

長い文字列を作成するとき、通常はSQLクエリを作成するようなことをしていることがわかります。

query = ' '.join((  # note double parens, join() takes an iterable
    "SELECT foo",
    "FROM bar",
    "WHERE baz",
))

レボンが提案したことは良いことですが、間違いに対して脆弱かもしれません:

query = (
    "SELECT foo"
    "FROM bar"
    "WHERE baz"
)

query == "SELECT fooFROM barWHERE baz"  # probably not what you want

8
+1コードレビューアが、各行の右端で不適切な空白がないかどうかを徹底的にチェックする必要がなくなります。@KarolyHorvathが指摘したように、OPはこの間違いを数回犯しました。
ボブスタイン

2
同様の方法でコード化された複数行の文字列を確認する場合、簡単に確認できるように、すべての行の左端に適切な空白が必要です。
アンブレラ

3
@ BobStein-VisiBoneコードレビューは、構文エラーやこのような小さなバグに関するものではなく、実質に関するものでなければなりません。誰かが構文エラーのあるレビューのためにコードを公開している場合(したがって、まったく実行されないか、特定の状況で実行されない場合)、何かが深刻な問題です。コミットする前にlintを実行することは難しくありません。そのような明らかな間違いを犯したためにプログラムが正しく実行されていないことに気付いていない人は、コミットするべきではありません。
Charles Addis

1
@CharlesAddisで合意されたコードレビューは、lint、構文の強調表示などの自動化されたメソッドの後に行う必要があります。バグから保護するためのすべての合理的な利点を利用することをお勧めします。
Bob Stein

33

"" "表記を使用する場合は、変数を連結することもできます。

foo = '1234'

long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ +  foo + """ aks
asdkfkasdk fak"""

編集:名前付きparamsと.format()を使用して、より良い方法を見つけました:

body = """
<html>
<head>
</head>
<body>
    <p>Lorem ipsum.</p>
    <dl>
        <dt>Asdf:</dt>     <dd><a href="{link}">{name}</a></dd>
    </dl>
    </body>
</html>
""".format(
    link='http://www.asdf.com',
    name='Asdf',
)

print(body)

26

このアプローチでは以下を使用します。

  • 最初の改行を避けるためにバックスラッシュを1つだけ
  • 三重引用符付き文字列を使用することにより、内部の句読点はほとんどありません
  • textwrap inspectモジュールを使用してローカルのインデントを取り除きます
  • account_idおよびdef_id変数には、Python 3.6形式の文字列補間( 'f')を使用します。

この方法は私には最もパイソンのように見えます。

# import textwrap  # See update to answer below
import inspect

# query = textwrap.dedent(f'''\
query = inspect.cleandoc(f'''
    SELECT action.descr as "action", 
    role.id as role_id,
    role.descr as role
    FROM 
    public.role_action_def,
    public.role,
    public.record_def, 
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id={account_id} AND
    def_id={def_id}'''
)

更新:1/29/2019 inspect.cleandoc代わりに使用する@ShadowRangerの提案を組み込みますtextwrap.dedent


5
注:最初の行を空にする必要がなく、最後に行継続文字があるので、inspect.cleandocは少し優れtextwrap.dedentています。
ShadowRanger

2
@ShadowRangerわあ、これまでcleandocを使ったことがない。私は私の答えを更新し、inspect.cleandocこれのために将来使用します。
Christopher Bruns

23

Python> = 3.6では、フォーマットされた文字列リテラル(f文字列)を使用できます

query= f'''SELECT   action.descr as "action"
    role.id as role_id,
    role.descr as role
    FROM
    public.role_action_def,
    public.role,
    public.record_def,
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id = {account_id} AND
    def_id = {def_id}'''

4
複数行の文字列の結果をログに記録し、左側のタブ/スペースを表示させたくない場合、f文字列はどのように機能しますか?
kuanb 2017年

7
SQLインジェクションに対して依然として脆弱
Trenton、

19

例えば:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1={} "
       "and condition2={}").format(1, 2)

Output: 'select field1, field2, field3, field4 from table 
         where condition1=1 and condition2=2'

条件の値が文字列である必要がある場合は、次のようにすることができます。

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1='{0}' "
       "and condition2='{1}'").format('2016-10-12', '2017-10-12')

Output: "select field1, field2, field3, field4 from table where
         condition1='2016-10-12' and condition2='2017-10-12'"

13

私が見つけtextwrap.dedent説明するように長い文字列のための最高のをここに

def create_snippet():
    code_snippet = textwrap.dedent("""\
        int main(int argc, char* argv[]) {
            return 0;
        }
    """)
    do_something(code_snippet)

1
私は自動改行を防ぐ黒いスラッシュが好きです、どうもありがとう!
-zyy

12

他の人は括弧メソッドについてすでに述べましたが、括弧でそれを追加したいので、インラインコメントは許可されます。

各フラグメントに関するコメント:

nursery_rhyme = (
    'Mary had a little lamb,'          # Comments are great!
    'its fleece was white as snow.'
    'And everywhere that Mary went,'
    'her sheep would surely go.'       # What a pesky sheep.
)

継続後のコメントは許可されません:

バックスラッシュ行継続(\)を使用する場合、コメントは許可されません。あなたは受け取りますSyntaxError: unexpected character after line continuation characterエラーを。

nursery_rhyme = 'Mary had a little lamb,' \  # These comments
    'its fleece was white as snow.'       \  # are invalid!
    'And everywhere that Mary went,'      \
    'her sheep would surely go.'
# => SyntaxError: unexpected character after line continuation character

正規表現文字列に対するより良いコメント:

https://docs.python.org/3/library/re.html#re.VERBOSEの例に基づいて、

a = re.compile(
    r'\d+'  # the integral part
    r'\.'   # the decimal point
    r'\d*'  # some fractional digits
)
# Using VERBOSE flag, IDE usually can't syntax highight the string comment.
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)

10

特に、Pythonのsqlite3モジュールを使用している場合、Pythonで生のSQLクエリを作成するための最良の(シンプルで安全かつPythonic)方法は次のとおりです

query = '''
    SELECT
        action.descr as action,
        role.id as role_id,
        role.descr as role
    FROM
        public.role_action_def,
        public.role,
        public.record_def,
        public.action
    WHERE
        role.id = role_action_def.role_id
        AND record_def.id = role_action_def.def_id
        AND action.id = role_action_def.action_id
        AND role_action_def.account_id = ?
        AND record_def.account_id = ?
        AND def_id = ?
'''
vars = (account_id, account_id, def_id)   # a tuple of query variables
cursor.execute(query, vars)   # using Python's sqlite3 module

長所

  • きちんとしたシンプルなコード(Pythonic!)
  • SQLインジェクションから安全
  • Python 2とPython 3の両方と互換性があります(結局のところPythonicです)。
  • 文字列の連結は不要
  • 各行の右端の文字がスペースであることを確認する必要はありません

短所

  • クエリ内の変数は?プレースホルダーに置き換えられるため、クエリ内に?変数が多数ある場合、どのPython変数でどれを置き換えるかを追跡するのが少し難しくなる場合があります。

これはテストしていませんが、疑問符の混乱を避けるために、関連する場所で疑問符を「{0} {1} {2}」に置き換え、最後の行をに変更することで注意できるでしょうcursor.execute(query.format(vars))。それはあなたの唯一の「詐欺」の世話をするべきです(私は願っています)。
ベン

はい、使用formatするとよいでしょうが、そのようにフォーマットされたクエリ文字列がSQLインジェクションから安全であるかどうかはわかりません。
Faheel

ええ、それは公平な点であり、確かに少し難しいかもしれません。おそらく、完全に使い捨ての何かでそれをテストすることは賢明でしょう...間違いなくコンプです。サイエンス。学部生はすぐに過ぎ去ります。;)
ベン

2
@Benを実行cursor.execute(query.format(vars))すると、準備されたステートメントから利益が得られなくなるため、パラメーターが単なる数値ではない場合、SQLクエリでそれらを二重引用符で囲む必要があるという事実から始めて、多くの種類の問題に対して脆弱になります。
Patrick Mevzek

4

私は通常、次のようなものを使用します。

text = '''
    This string was typed to be a demo
    on how could we write a multi-line
    text in Python.
'''

各行の迷惑な空白を削除したい場合は、次のようにします。

text = '\n'.join(line.lstrip() for line in text.splitlines())

2
textwrap.dedent標準ライブラリにあるPythonの関数を調べてください。必要な機能が備わっています。
bjd2385

@ bjd2385:inspect.cleandoc若干優れています(テキストが開いた引用符と同じ行に表示されるかどうかの面倒が少なく、明示的な行継続文字を必要としません)。
ShadowRanger

3

あなたの実際のコードは、あなたが「行」の末尾に空白が欠落している、動作してはならない(例:role.descr as roleFROM...

複数行の文字列には三重引用符があります:

string = """line
  line2
  line3"""

改行と余分なスペースが含まれますが、SQLの場合は問題ありません。


3

sql-statementを別のファイルaction.sqlに配置して、pyファイルに読み込むこともできます。

with open('action.sql') as f:
   query = f.read()

したがって、sql-statementsはpythonコードから分離されます。Pythonから入力する必要があるSQLステートメントにパラメーターがある場合は、文字列のフォーマットを使用できます(%sや{field}など)


3

" Àla " Scala方式(ただし、OQが要求する最もパイソン的な方法だと思います):

description = """
            | The intention of this module is to provide a method to 
            | pass meta information in markdown_ header files for 
            | using it in jinja_ templates. 
            | 
            | Also, to provide a method to use markdown files as jinja 
            | templates. Maybe you prefer to see the code than 
            | to install it.""".replace('\n            | \n','\n').replace('            | ',' ')

ジャンプ行のない最後のstrが必要な場合\nは、2番目の置換の最初の引数の先頭に置くだけです。

.replace('\n            | ',' ')`.

注:「...テンプレート」間の白い線。また、「また、...」の後には空白が必要|です。


3

tl; dr:"""\および"""を使用して、次のように文字列をラップします

string = """\
This is a long string
spanning multiple lines.
"""

以下からの公式Pythonドキュメント

文字列リテラルは複数行にまたがることができます。1つの方法は、 "" "..." ""または '' '...' ''のように三重引用符を使用することです。行の終わりは自動的に文字列に含まれますが、行の終わりに\を追加することでこれを防ぐことができます。次の例:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

次の出力が生成されます(最初の改行は含まれません)。

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

2

このフォーマットのように、このプロパティについて問い合わせが成功したような連続した行が返されるように、このような動作を期待してみてください `

"message": f'you have successfully inquired about '
           f'{enquiring_property.title} Property owned by '
           f'{enquiring_property.client}'

1

再帰関数を使用して複雑なSQLクエリを作成しています。この手法は一般的に、コードの可読性を維持しながら大きな文字列を構築するために使用できます。

# Utility function to recursively resolve SQL statements.
# CAUTION: Use this function carefully, Pass correct SQL parameters {},
# TODO: This should never happen but check for infinite loops
def resolveSQL(sql_seed, sqlparams):
    sql = sql_seed % (sqlparams)
    if sql == sql_seed:
        return ' '.join([x.strip() for x in sql.split()])
    else:
        return resolveSQL(sql, sqlparams)

PS:必要に応じてSQLクエリをきれいに出力する素晴らしいpython-sqlparseライブラリを見てください。 http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format


「再帰関数」はラムダと呼ばれるものではありませんか?
m3nda 2015年

1

コード(変数など)がインデントされており、出力文字列が1行(改行なし)である場合に、より読みやすいと思う別のオプション:

def some_method():

    long_string = """
a presumptuous long string 
which looks a bit nicer 
in a text editor when
written over multiple lines
""".strip('\n').replace('\n', ' ')

    return long_string 

1

三重引用符を使用します。多くの場合、人々はこれらを使用して、プログラムの開始時にdocstringを作成し、目的とその作成に関連するその他の情報を説明します。人々はまた、関数でこれらを使用して、関数の目的とアプリケーションを説明します。例:

'''
Filename: practice.py
File creator: me
File purpose: explain triple quotes
'''


def example():
    """This prints a string that occupies multiple lines!!"""
    print("""
    This
    is 
    a multi-line
    string!
    """)

0

私はこのアプローチが好きです。長い文字列がある場合、方法はありません!インデントのレベルに応じて、1行あたり80文字に制限されます...まあ...他に何も言う必要はありません。私の見解では、Pythonスタイルガイドはまだ非常にあいまいです。@Eero Aaltonenのアプローチを採用したのは、それが読書の特権と常識だからです。スタイルガイドが私たちを助け、私たちの生活を混乱させないことを理解しています。ありがとう!

class ClassName():
    def method_name():
        if condition_0:
            if condition_1:
                if condition_2:
                    some_variable_0 =\
"""
some_js_func_call(
    undefined, 
    {
        'some_attr_0': 'value_0', 
        'some_attr_1': 'value_1', 
        'some_attr_2': '""" + some_variable_1 + """'
    }, 
    undefined, 
    undefined, 
    true
)
"""

0

以下からの公式Pythonドキュメント

文字列リテラルは複数行にまたがることができます。1つの方法は、 "" "..." ""または '' '...' ''のように三重引用符を使用することです。行の終わりは自動的に文字列に含まれますが、行の終わりに\を追加することでこれを防ぐことができます。次の例:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

次の出力が生成されます(最初の改行は含まれません)。


0

dict内で長い文字列を定義し 、改行を維持しながらスペースを省略したため、次のような定数で文字列を定義することになりました。

LONG_STRING = \
"""
This is a long sting
that contains newlines.
The newlines are important.
"""

my_dict = {
   'foo': 'bar',
   'string': LONG_STRING
}

0

Pythonで長い文字列への一般的なアプローチとして、あなたはトリプル引用符を使用することができ、splitそしてjoin

_str = ' '.join('''Lorem ipsum dolor sit amet, consectetur adipiscing 
        elit, sed do eiusmod tempor incididunt ut labore et dolore 
        magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
        ullamco laboris nisi ut aliquip ex ea commodo.'''.split())

出力:

'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.'

SQLクエリに関するOPの質問に関して、以下の回答では、SQLクエリを構築するためのこのアプローチの正確さを無視し、追加のインポートなしで読み取り可能で美的な方法で長い文字列を構築することにのみ焦点を当てています。また、これに伴う計算負荷も無視されます。

三重引用符を使用して、長くて読みやすい文字列を作成し、それを使用してリストに分割しsplit()、空白を取り除いてから、で結合し' '.join()ます。最後に、format()コマンドを使用して変数を挿入します。

account_id = 123
def_id = 321

_str = '''
    SELECT action.descr AS "action", role.id AS role_id, role.descr AS role 
    FROM public.role_action_def, public.role, public.record_def, public.action
    WHERE role.id = role_action_def.role_id 
    AND record_def.id = role_action_def.def_id 
    AND' action.id = role_action_def.action_id 
    AND role_action_def.account_id = {} 
    AND record_def.account_id = {} 
    AND def_id = {}
    '''

query = ' '.join(_str.split()).format(account_id, account_id, def_id)

生成する:

SELECT action.descr AS "action", role.id AS role_id, role.descr AS role FROM public.role_action_def, public.role, public.record_def, public.action WHERE role.id = role_action_def.role_id AND record_def.id = role_action_def.def_id AND\' action.id = role_action_def.action_id AND role_action_def.account_id = 123 AND record_def.account_id=123 AND def_id=321

編集:このアプローチはPEP8と一致していませんが、私はそれが時々役立つと思います


-7

一般的に、私は複数行コメント/文字列にlistとを使用しjoinます。

lines = list()
lines.append('SELECT action.enter code here descr as "action", ')
lines.append('role.id as role_id,')
lines.append('role.descr as role')
lines.append('FROM ')
lines.append('public.role_action_def,')
lines.append('public.role,')
lines.append('public.record_def, ')
lines.append('public.action')
query = " ".join(lines)

' \n'(newline)または ' ,'(comma)または ' '(space)のような任意の文字列を使用して、このすべてのリスト要素を結合できます。

乾杯..!!


1
少なくとも配列リテラルを使用しないのはなぜですか?
アレクサンダー-モニカを復活


これはうまくいくと思いますが、パフォーマンスと読みやすさについて考える必要があります...
Petro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.