我必须多次创建与此类似的代码:
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创建两个单独的消息中断,由于可能的组合数量,有时甚至不可行。
有更优雅的方法吗?
答案 0 :(得分:3)
创建单词列表,必要时插入,然后' '.join(words)
。
如果有逗号/句点,请构建句子结构:
[['If', 'there', 'are', 'periods'], ', ', ['build', 'a', 'sentence', 'structure'], '.']
在interpunction中有相应的空格(逗号后的空格,括号前的空格,......)然后' '.join()
组内的单词和''.join()
个别组。 (感谢@Alfe提出的加入单词和组的建议不同)。
答案 1 :(得分:2)
使用DRY创建两个单独的消息中断
如果你关心i18n,那么创建两个单独的消息可能是唯一合理的方法。
答案 2 :(得分:1)
对于" not"
案例,请保持简单:
print "A five ounce bird could{0} carry a one pound coconut".format(" not" if condition() else "")
答案 3 :(得分: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
大写第一个单词等等。
答案 4 :(得分:1)
由于空格必须在哪里以及哪些不清楚的规则用英语(以及我所知道的其他语言),你可以使用所有句子部分的简单列表(例如['If', 'there', 'are', 'commas', ',', 'we', 'insert', 'them', '.']
),然后写一个专门的join函数,它适用于必须插入空格的英语规则(例如,在逗号之后,在开括号之前,......之间)。
答案 5 :(得分: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...
但是,它也很脏......
答案 6 :(得分:0)
我会增加另一种可能性,我只是想到了自己。子类string.Formatter
并添加自定义转换器,因此您可以键入
fmt = MyFormatter()
print fmt("Problem {not!w} solved", not="")
如果变量为空/未指定,格式化程序将使用!w
转换器删除所有字段前的空格。这需要至少重新实现vformat
和convert_field
方法,但这应该是非常可行的。