2016-09-10 120 views
-1

我開發了一個Python程序,我需要關於簡化的建議。Python - 如何縮短代碼

這是我的代碼部分:

import wx 
import sys 
import socket 

def error_handler(c): 
    if c == 'canceled': 
     sys.exit('User canceled configuration.') 
    elif c == 'empty': 
     sys.exit('Empty value.') 


def hostname(): 
    dlg = wx.TextEntryDialog(None, 
          'What is your default Hostname?', 
          'Hostname', 
          socket.gethostname()) 

    if dlg.ShowModal() == wx.ID_CANCEL: 
     error_handler('canceled') 
    else: 
     if dlg.GetValue() == "": 
      error_handler('empty') 
     else: 
      HOSTNAME = dlg.GetValue() 
      return HOSTNAME 


def random_hostname(): 
    dlg = wx.SingleChoiceDialog(None, 
           'Do you want to randomize your Hostname', 
           'Randomize', 
           ['Yes', 'No', 'Disable'], 
           wx.CHOICEDLG_STYLE) 

    if dlg.ShowModal() == wx.ID_CANCEL: 
     error_handler('canceled') 
    else: 
     RANDOM_HOSTNAME = dlg.GetStringSelection() 
     return RANDOM_HOSTNAME 


def nameserver(): 
    dlg = wx.TextEntryDialog(None, 
          'Nameserver IP\n', 
          'Nameserver', 
          '127.0.0.1') 

    if dlg.ShowModal() == wx.ID_CANCEL: 
     error_handler('canceled') 
    else: 
     if dlg.GetValue() == "": 
      error_handler('empty') 
     else: 
      NAMESERVER = dlg.GetValue() 
      return NAMESERVER 


def main(): 
    app = wx.App() 
    print 'HOSTNAME =', hostname() 
    print 'RANDOM_HOSTNAME =', random_hostname() 
    print 'NAMESERVER =', nameserver() 
    app.MainLoop() 


if __name__ == '__main__': 
    main() 

在這段代碼中我做功能主機名,隨機主機名和域名服務器,但在所有3個功能我要重複幾乎同樣的代碼:

if dlg.ShowModal() == wx.ID_CANCEL: 
    error_handler('canceled') 
else: 
    if dlg.GetValue() == "": 
     error_handler('empty') 
    else: 
     HOSTNAME = dlg.GetValue() 
     return HOSTNAME 

但我想做超過20個函數來檢查一些值。 是否有(並且我知道有)更好的技巧來縮短每個功能?

我想是這樣的:

import wx 
import sys 
import socket 

def error_handler(c): 
    if c == 'canceled': 
     sys.exit('User canceled configuration.') 
    elif c == 'empty': 
     sys.exit('Empty value.') 
    else 
     return dialog value 


def hostname(): 
    dlg = wx.TextEntryDialog(None, 
          'What is your default Hostname?', 
          'Hostname', 
          socket.gethostname()) 

    error_handler(dlg) 


def random_hostname(): 
    dlg = wx.SingleChoiceDialog(None, 
           'Do you want to randomize your Hostname', 
           'Randomize', 
           ['Yes', 'No', 'Disable'], 
           wx.CHOICEDLG_STYLE) 

    error_handler(dlg) 


def nameserver(): 
    dlg = wx.TextEntryDialog(None, 
          'Nameserver IP\n', 
          'Nameserver', 
          '127.0.0.1') 

    error_handler(dlg) 


def main(): 
    app = wx.App() 
    print 'HOSTNAME =', hostname() 
    print 'RANDOM_HOSTNAME =', random_hostname() 
    print 'NAMESERVER =', nameserver() 
    app.MainLoop() 


if __name__ == '__main__': 
    main() 

我要感謝大家誰都會幫助我。

+0

這將有可能在codeview.stackexchage更好地工作:http://codereview.stackexchange.com/。我建議在那裏問。 –

+0

哦。不知道我張貼錯誤的部分。 thx爲消化 –

回答

0

看起來你已經知道創建另一個函數的答案,error_handler做重複的工作!你可以換你的錯誤處理程序的try/except塊看起來沿此線的東西:

def hostname(): 
    try: 
     dlg = wx.TextEntryDialog(None, 
        'What is your default Hostname?', 
        'Hostname', 
         socket.gethostname()) 
    except: 
     error_handler(dlg) 
0
def funct(dlg, wx, funcCheck): 
    if dlg.ShowModal() == wx.ID_CANCEL: 
     error_handler('canceled') 
    else: 
     if dlg.GetValue() == "": 
      error_handler('empty') 
     else: 
      value = funcCheck() 
      return value 

那麼你可以這樣調用它

funct(dlg, wx, dlg.GetValue) 

繼續添加條件的功能取決於你想要什麼