python,一般函数:return 字符串和打印函数或只是函数中的打印语句?

python, functions in general: return string and print function OR just print statement in function?

起初:这只是关于"cleanest"编码方式的问题。

我写了一个 Python script/programm 有几个 类 和功能,来存储一些西班牙语词汇。 最后,所有这些都汇集在接口函数中,它传递一些用户输入。大致是这样的:

if __name__ == "__main__":
    while True:
    answ = raw_input("Please select an option below:\n"
                     "(1) New Vocab\n"
                     "(2) Testing Vocabs\n"
                     "(3) Search vocab (Edit|Delet)\n"
                     "(4) List all vocabs\n"
                     "(5) Show Boxes\n")
                     #...blabla

    os.system("clear")

    if INPUT(answ,"1"):
        IF_new_vocab(book)
        book.save_dic()

    elif INPUT(answ,"2"):
        IF_voc_query(book)
        book.save_dic()

    elif INPUT(answ,"3"): 
        book.search_vocab()
        book.save_dic()
    elif INPUT(answ,"4"):
        print book.show_cache()    #A

    elif INPUT(answ,"5"):
        book.update_boxes()
        book.show_boxes()          #B
    #...blabla

现在我的问题是: 我应该 return 一个字符串并尽可能晚地使用打印,在这种情况下就是 "interface" 。 (例如选项 A)? 或者输出,在大多数情况下是一个字符串,应该由 method/function 本身打印(例如选项 B)?

我知道它根本不会影响整体输出。但我一直想知道是否有约定或理由更喜欢一个选项。

肯定有return字符串的功能,越晚打印越好!

提前打印会违反 open-closed principle。也就是说,一般来说,您的代码应该努力 禁止修改 。这确保如果您稍后决定要打印字符串输出两次,或将字符串输出传递给 API,或将字符串输出保存在文件中,则不必修改原始字符串将字符串放在一起的代码(book.show_cache 函数)

在某些情况下,您可能希望有时打印输出,有时将其保存在文件中,有时将其传递给 API,有时做其他事情。在这种情况下,如果您的代码到那时已经对扩展开放,那么您将最高兴,这样您就可以简单地添加不同的函数/接口/处理程序来处理不同格式的输出方式,而不是必须重写 show_cache 函数的变体 3-4 次不同的时间来处理不同的用法。这是 strategy 设计模式的基础!

您最终可能会得到如下所示的内容:

def print_cache():
  print book.show_cache()

def save_cache_to_file():
  save(book.show_cache())

def search_google_for_cache():
  // google.search(book.show_cache())

短很多
def print_cache():
  vocab = ['hola', 'como', 'estas', 'bien', 'y', 'tu']
  // more code?
  print vocab

def save_cache_to_file():
  vocab = ['hola', 'como', 'estas', 'bien', 'y', 'tu']
  // more code?
  save(book.show_cache())

def search_google_for_cache():
  vocab = ['hola', 'como', 'estas', 'bien', 'y', 'tu']
  // more code?
  // google.search(vocab)

另外,在第二个例子中,如果你想添加更多的词汇,你必须记住在三个不同的地方进行,让你的代码更容易维护!