4

これに似たコードを数回作成する必要がありました。

if condition():
    word = " not"
else:
    word = ""

print "A five ounce bird could{0} carry a one pound coconut".format(word)

私はここで問題を骨まで取り除きました。「練習」では、、、、、、の追加の変数があり、それらが"A"すべて変更される可能性があり、それらに加えて、複数のs-esなどが追加されます。"five""bird""a""one""coconut"

それはいつも私を満足させるよりも幾分少ないと感じてきました。前に余分なスペースが必要で、両方"not"の前にスペースがありませんが、空の場合は2つのスペースが必要ないため、他の方法はありません。{0}word

2つの別々のメッセージを作成すると、DRYが機能しなくなり、可能な組み合わせの数が多いために実行できない場合もあります。

これを行うためのよりエレガントな方法はありますか?

4

7 に答える 7

3

単語のリストを作成し、必要に応じて挿入してから、' '.join(words)それらを挿入します。

カンマ/ピリオドがある場合は、文型を作成します。

[['If', 'there', 'are', 'periods'], ', ', ['build', 'a', 'sentence', 'structure'], '.']

句読点にそれぞれのスペース(コンマの後のスペース、括弧の前のスペースなど)を使用し、次に' '.join()グループ内の単語と''.join()個々のグループを使用します。(単語やグループを別の方法で参加させる提案をしてくれた@Alfeに感謝します)。

于 2012-05-23T11:10:16.967 に答える
2

DRY で 2 つの別個のメッセージを作成すると壊れる

i18nに関心がある場合は、2 つの別個のメッセージを作成することがおそらく唯一の合理的な方法です。

于 2012-05-23T11:12:32.130 に答える
1

英語(および私が知っている他の言語)では、スペースが必要な場所とそうでない場所の規則が明確であるため、すべての文の部分の単純なリスト(例['If', 'there', 'are', 'commas', ',', 'we', 'insert', 'them', '.'])を使用して、英語の規則をどこに適用するかを示す特殊な結合関数を作成できます。スペースを挿入する必要があります(たとえば、単語の間、コンマの後、括弧を開く前など)。

于 2012-05-23T11:29:53.653 に答える
1

これを処理するもう1つの方法ですが、それがあなたが探しているものであるかどうかはわかりません

word = "not"

print "A five ounce bird could{0} carry a one pound coconut".format(" "+word if condition() else "")

わかりました、もう1つのアプローチ。しかし実際には、それらのほとんどすべてが類似または同じです...

def format_word(word):
    if word:
        return " " + word
    else:
        return ""

print "A five ounce bird could{0} carry a one pound coconut".format(format_word(word))

しかし、おそらく、それらは実際には似ているので、すべてがイライラしているように見えます...

最終的な汚いアプローチは次のようになります。

if condition():
    word = "not"
else:
    word = ""

wrd =  "A five ounce bird could {0} carry a one pound coconut".format(word)
print wrd.replace("  ", " ") # replace all double spaces with singular one...

でもそうです、それも汚れています...

于 2012-05-23T11:30:23.937 に答える
1

私はするだろう...

word = ("could" if not condition() else "could not")

print "A five ounce bird {0} carry a one pound coconut".format(word)

:P

編集:あなたが望む一般的なケースでは、私は構成で行きます。例えば。(わかりました、これはあまりにも Go4 であり、私の好みには単純すぎますが、要点はわかります):

class Agglutinator(list):
    def __str__(self):
        return self._separator.join(str(x) for x in self)


class Paragraph(Agglutinator):
    """Returns dot separated sentences""" 
    _separator = '. '

class Sentence(Agglutinator):
    """Returns comma separated clauses""" 
    _separator = ', '

class Clause(Agglutinator):
    """Returns space separated words"""
    _separator = ' '

c1 = Clause(["A", "number", "of", "words", "make", "a", "clause"])
c2 = Clause(["and", "a", "number", "of", "clauses", "make", "a", "sentence"])
c3 = Clause(["A", "collection", "of", "sentences", "makes", "a", "paragraph"])

s1 = Sentence([c1, c2])
s2 = Sentence([c3])

print Paragraph([s1, s2])

これにより、次のことが得られます。

A number of words make a clause, and a number of clauses make a sentence. A collection of sentences makes a paragraph

少し詳しく説明するとSentence、最初の単語などを大文字にすることができます。

于 2012-05-23T11:18:11.137 に答える
1

この" not"場合は、単純にしてください。

print "A five ounce bird could{0} carry a one pound coconut".format(" not" if condition() else "")
于 2012-05-23T11:12:46.733 に答える
0

私が自分で考えた別の可能性を追加します。カスタムコンバーターをサブクラスstring.Formatter化して追加し、入力できるようにします

fmt = MyFormatter()
print fmt("Problem {not!w} solved", not="")

!wフォーマッタは、変数が空/指定されていない場合、コンバーターを使用してすべてのフィールドの前にあるスペースを削除します。これには、少なくともメソッドvformatconvert_fieldメソッドを再実装する必要がありますが、かなり実行可能です。

于 2012-05-23T11:44:00.240 に答える