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

В этом коде я делаю функцию Hostname, Random имя хоста и сервер имен, но и во всех 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 для sugestion –

ответ

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) 

Продолжайте добавлять условия к функция в зависимости от того, что вы хотите

Смежные вопросы