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

时间:2018-01-25 00:17:43

标签: python function printing return coding-style

起初:这只是一个关于"最干净"的问题。代码方式。

我编写了一个包含多个类和函数的Python脚本/程序,用于存储一些西班牙语词汇。 最后,所有这些都汇集在接口函数中,该函数传递一些用户输入。大概是这样的:

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

现在我的问题是: 我应该返回一个字符串并尽可能晚地使用打印,这将是"界面"在这种情况下。 (例如选项A)? 或者输出(在大多数情况下是字符串)是否应由方法/函数本身打印(例如选项B)?

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

1 个答案:

答案 0 :(得分:2)

绝对有函数返回字符串并尽可能晚地打印!

提前打印会违反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)

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