2016-09-10 122 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) 

继续添加条件的功能取决于你想要什么