2017-10-24 7 views
0

私はWordpressをバックアップするためにpythonスクリプト関数を書いています。スクリプトの一環として、config.phpファイルからデータベースの詳細を取得する関数を作成しました。Wordpress/config.phpを解析するために私のPython関数を改善するための提案

私の機能の作業が

関数は、引数としてWordpressのインストール場所を取り、DB_USER、DB_HOST、DB_USER、そのファイルからDB_PASSWORDに一致するように正規表現を使用して「の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) 
+0

これはおそらくhttps://codereview.stackexchange.com/に投稿する必要があります。 –

答えて

1

を編集した後、あなたは通常、そのような関数内sys.exitを使用しないでください。むしろ、失敗した場合に例外を発生させてください。可能であれば、何がうまくいかないかを詳述する例外でなければならないか、または既存の例外を伝播させることができます。

Pythonの通常のルールは、これを処理する方法を知っている場所での例外処理です。

コードでは、例外を検出して何をすべきか分からないので、sys.exitに電話してください。これに代えて、以下を行う必要があります。

  1. は例外がそれをキャッチして、より具体的なものでは例外、および再昇給を包む
  2. 適切な場合 sys.exitを呼び出すことができ、トップレベルの関数にまで伝播してみましょうしたがって、より高いレベルの関数は特定の例外をキャッチするようになります。たとえば、関数がカスタム ConfigFileNotFound例外または ConfigFileUnparseable例外を発生させる可能性があります。

except exceptionと入力してください。おそらくexcept Exceptionを意味します。しかし、これは非常に幅広く、他のプログラミングエラーを隠すでしょう。代わりに、期待する特定の例外クラスをキャッチします。

+0

私はあなたの提案に従ってコードを変更しました。 –

+0

@FujiCladoこれは特定の例外を捕まえるという点で大きな改善です。あなたの関数があなたのスクリプトの中のちょうど1つの場所とその単純なスクリプトで使われているなら、そのような 'sys.exit'を使っても問題ありません。この関数をより再利用できるようにするには、 'sys.exit'の代わりにカスタム例外を生成し、' parsing_db_info'を呼び出す上位レベルの関数にキャッチする必要があります。 – spookylukey

+0

あなたの素晴らしいサポートに感謝します。 –

関連する問題