繁体   English   中英

Python - 如何缩短代码

[英]Python - How to shorten code

我开发了一个 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()

我要感谢所有帮助我解决这个问题的人。

看起来您已经知道创建另一个函数error_handler来完成重复工作的答案! 您可以将错误处理程序包装在一个try/except块中,该块看起来像这样:

def hostname():
    try:
        dlg = wx.TextEntryDialog(None,
                     'What is your default Hostname?',
                     'Hostname',
                      socket.gethostname())
    except:
        error_handler(dlg)
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)

根据您的需要继续向函数添加条件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM