改进python函数以解析Wordpress/config.php的建议

改进python函数以解析Wordpress/config.php的建议,python,python-2.7,python-3.x,function,Python,Python 2.7,Python 3.x,Function,我正在编写一个python脚本函数来备份Wordpress。作为脚本的一部分,我编写了一个从config.php文件获取数据库详细信息的函数 我的职能运作 函数以Wordpress安装位置为参数,使用正则表达式匹配该文件中的db_用户、db_主机、db_用户、db_密码,如果找不到“config.php”,则函数将存在我正在使用sys.exit(1)退出函数,这是退出函数的正确方法吗?我正在粘贴函数代码片段 def parsing_db_info(location): config_pa

我正在编写一个python脚本函数来备份Wordpress。作为脚本的一部分,我编写了一个从config.php文件获取数据库详细信息的函数

我的职能运作

函数以Wordpress安装位置为参数,使用正则表达式匹配该文件中的db_用户、db_主机、db_用户、db_密码,如果找不到“config.php”,则函数将存在我正在使用sys.exit(1)退出函数,这是退出函数的正确方法吗?我正在粘贴函数代码片段

def parsing_db_info(location):
    config_path = os.path.normpath(location+'/config.php')
    if os.path.exists(config_path):
        try:
            regex_db = r'define\(\s*?\'DB_NAME\'\s*?,\s*?\'(.*?)\'\s*?'.group(1)
            regex_user = r'define\(\s*?\'DB_USER\'\s*?,\s*?\'(.*?)\'\s*?'.group(1)
            regex_pass = r'define\(\s*?\'DB_PASSWORD\'\s*?,\s*?\'(.*?)\'\s*?'.group(1)
            regex_host = r'define\(\s*?\'DB_HOST\'\s*?,\s*?\'(.*?)\'\s*?'.group(1)
            db_name = re.match(regex_db,config_path).group(1)
            db_user = re.match(regex_user,config_path).group(1)
            db_pass = re.match(regex_pass,config_path).group(1)
            db_host = re.match(regex_host,config_path).group(1)
            return {'dbname':db_name , 'dbuser':db_user , 'dbpass':db_pass , 'dbhost':db_host}
        except exception as ERROR:
            print(ERROR)
            sys.exit(1)
    else:
        print('Not Found:',config_path)
        sys.exit(1)
编辑后

def parsing_db_info(location):
        config_path = os.path.normpath(location+'/wp-config.php') 
        try:
            with open(config_path) as fh:
                content = fh.read()
            regex_db = r'define\(\s*?\'DB_NAME\'\s*?,\s*?\'(.*?)\'\s*?'
            regex_user = r'define\(\s*?\'DB_USER\'\s*?,\s*?\'(.*?)\'\s*?'
            regex_pass = r'define\(\s*?\'DB_PASSWORD\'\s*?,\s*?\'(.*?)\'\s*?'
            regex_host = r'define\(\s*?\'DB_HOST\'\s*?,\s*?\'(.*?)\'\s*?'         
            db_name = re.search(regex_db,content).group(1)
            db_user = re.search(regex_user,content).group(1)
            db_pass = re.search(regex_pass,content).group(1)
            db_host = re.search(regex_host,content).group(1)
            return {'dbname':db_name , 'dbuser':db_user , 'dbpass':db_pass , 'dbhost':db_host}

        except FileNotFoundError:
            print('File Not Found,',config_path)
            sys.exit(1)

        except PermissionError:
            print('Unable To read Permission Denied,',config_path)
            sys.exit(1)
        except AttributeError:
            print('Parsing Error wp-config seems to be corrupt,')
            sys.exit(1)

为了回答您的问题,您通常不应该在这样的函数中使用
sys.exit
。相反,让它在失败时引发异常。最好是一个异常,详细说明发生了什么错误,或者您可以让现有的异常传播

Python中的一般规则是:在您知道如何处理异常的地方处理异常

在代码中,您捕获到一个异常,然后不知道该做什么,因此调用
sys.exit
。与此相反,您应该:

  • 让异常传播到可以捕获它的顶级函数,然后调用
    sys.exit
    (如果合适)
  • 用更具体的方式包装异常,并重新引发,以便更高级别的函数将捕获特定的异常。例如,您的函数可能引发自定义的
    ConfigFileNotFound
    异常或
    ConfigFileUnparseable
    异常

  • 另外,您已经放置了
    除异常
    ,您的意思可能是
    除异常
    。然而,这是非常广泛的,并将掩盖其他编程错误。相反,捕获您期望的特定异常类。

    这可能应该发布在我正在使用的“足够好”上。谢谢,效果很好。我已经根据您的建议更改了所有代码。@FujiClado这在捕获特定异常方面是一个很大的改进。如果您的函数只在脚本中的一个位置使用,并且是一个简单的脚本,那么像这样使用
    sys.exit
    就可以了。如果希望此函数更具可重用性,则不应使用
    sys.exit
    ,而应引发自定义异常,并在调用
    parsing\u db\u info