4

我不得不多次创建类似的代码:

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

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

我已经在这里将问题分解为基本问题,在“实践”中,会有额外的变量"A", "five", "bird", "a", "one", 等,"coconut"因此它们可能都会发生变化,并且与它们一起添加了复数 s-es 和诸如此类的东西。

它总是让我觉得不太令人满意。之前需要的额外空间和两个讨厌"not"的空间之前{0}都没有空间,但由于我不希望有两个空格,如果word是空的,我看不出有任何其他方法可以做到这一点。

创建两个单独的消息会破坏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 创建两条单独的消息

如果您关心i18n,那么创建两条单独的消息可能是唯一合理的方法。

于 2012-05-23T11:12:32.130 回答
1

由于在英语中(以及在我知道的其他语言中)空格必须在哪里以及在哪里不明确的规则,您可以使用所有句子部分(例如['If', 'there', 'are', 'commas', ',', 'we', 'insert', 'them', '.'])的简单列表,然后编写一个专门的连接函数,将英语规则应用于 where必须插入空格(例如,单词之间、逗号之后、左括号之前……)。

于 2012-05-23T11:29:53.653 回答
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 回答
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

处理此问题的另一种方法,但不确定它是否是您正在寻找的

word = "not"

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

好的,还有一种方法。但事实上,几乎所有这些都是相似或相同的......

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 回答
0

我将添加我刚刚想到的另一种可能性。子类化string.Formatter并添加自定义转换器,因此您可以键入

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

!w如果变量为空/未指定,则格式化程序将删除所有带有转换器的字段之前的空格。这需要至少重新实现vformatandconvert_field方法,但它应该是非常可行的。

于 2012-05-23T11:44:00.240 回答