質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

解決済

PYTHONソースファイルのリファクタリング

yuujiMotoki
yuujiMotoki

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

4回答

0評価

1クリップ

29閲覧

投稿2020/02/14 00:44

編集2022/01/12 10:58

仕事でPYTHON-FLASKを使ったアプリケーションを作っています。

ほとんどの処理をpython.appというファイルに入れています。
理由としては、PYTHON自体がIMPORT等を使っても、動作としては
全部読み込んで動くスクリプトなので、分割することによるメリットがないためです。

直近ですが、ソースコードを引き継ぐ必要が出てきたので、
コードを短く書く検討を始めています。

そこで添付のようなコードの場合は、どこを、どのように切れば
このようなコード縮小が可能でしょうか?

いまだ未熟者のため、リファクタリングで動かなくなるリスクを懸念して
手が付けられていない状況です。

参考のソースファイルを下記に示します。

実際には、これらの5倍ぐらいのコードがあります。
忌憚のないご意見を頂けましたら幸いです。

python

import os import sys import io import time import numpy as np import pandas as pd import cv2 from flask import Flask, render_template, request, redirect, url_for, send_from_directory, session, flash, make_response import pdb import PyPDF2 import random import json from flask_sqlalchemy import SQLAlchemy from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import sqlite3 from datetime import datetime from werkzeug.utils import secure_filename import Fxx_COUNT as fsc import secrets import logging import string LOGFILE = "LOGFILE.log" app = Flask(__name__) app.secret_key = 'any random string' app.logger.setLevel(logging.DEBUG) fh = logging.FileHandler(LOGFILE) fh.setLevel(logging.DEBUG) app.logger.addHandler(fh) UPLOAD_FOLDER = './uploads/' STRAGE_FOLDER = './strages/' TEMP_FOLDER = './temp/' STATIC_FOLDER = './static/' ALLOWED_EXTENSIONS = set(['png', 'jpg', 'PNG', 'JPG', 'pdf']) IMAGE_WIDTH = 640 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///members.db' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # MCOのオリジナルをアップロードするフォルダ app.config['STRAGE_FOLDER'] = STRAGE_FOLDER # 処理済ファイルをアップロードするフォルダ app.config['TEMP_FOLDER'] = TEMP_FOLDER # 処理済ファイルをアップロードするフォルダ app.config['STATIC_FOLDER'] = STATIC_FOLDER # 処理済ファイルをアップロードするフォルダ app.config['SECRET_KEY'] = os.urandom(24) PATTERN_FILE = "Fxx.png" #db = SQLAlchemy() # db.init_app(app) def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS # members.dbから、CUSTOMERSを読み込んで、VARへ挿入する @app.route('/customer') def customer(): conn = sqlite3.connect(app.config['DATABASE']) cur = conn.cursor() cur.execute("SELECT * FROM customers") var = cur.fetchall() conn.close() return render_template('customer.html', var=var) # items sign up @app.route('/customer_signed_up', methods=['GET', 'POST']) def customer_signed_up(): # pdb.set_trace() session['username'] = request.form['username'] password = request.form['password'] conn = sqlite3.connect(app.config['DATABASE']) cur = conn.cursor() cur.execute("INSERT INTO customers(username,password) VALUES (?,?)", (session['username'], password)) conn.commit() conn.close() return redirect(url_for('logout')) # items delete @app.route('/customer_delete', methods=['GET', 'POST']) def customer_delete(): session['username'] = request.form['username'] password = request.form['password'] conn = sqlite3.connect(app.config['DATABASE']) cur = conn.cursor() cur.execute("delete from customers where username=?", (session['username'],)) cur.execute("delete from response where username=?", (session['username'],)) cur.execute("delete from response2 where username=?", (session['username'],)) conn.commit() conn.close() return redirect(url_for('logout')) # ログイン処理 ← SESSION変数にログインしたユーザーの名前が入る @app.route('/customer_logged_in', methods=['GET', 'POST']) def customer_logged_in(): session['username'] = request.form['username'] dir1=os.path.join(app.config['UPLOAD_FOLDER'],session['username']) if not os.path.exists(dir1): os.mkdir(dir1) app.logger.info('%s logged in successfully', session['username']) return redirect(url_for('homepage_customer')) # メインページへの誘導のため、データベースのテーブルを呼び出す @app.route('/') @app.route('/homepage_customer') def homepage_customer(): if 'username' in session: conn = sqlite3.connect(app.config['DATABASE']) cur = conn.cursor() cur.execute("SELECT * FROM response WHERE username=? order by url asc" , (session['username'],)) response = cur.fetchall() cur.execute("SELECT * FROM response2 WHERE username=?", (session['username'],)) response2 = cur.fetchall() conn.close() image = {} my_images = [] # イメージ画像の辞書 for id, name, file1, number, sender in response: if file1.endswith('.png'): image['url'] = file1 image['id']=id image['message']=number if sender == 0: sender = 0 elif not sender: sender = -1 image['sender']=sender my_images.append(image.copy()) pimage = {} p_images = [] for id,name, file2, sel ,dum,dum in response2: if file2.endswith('.png'): pimage['id'] = id pimage['url'] = file2 p_images.append(pimage.copy()) return render_template('index.html', items=my_images, p_items=p_images, USER=session['username']) return redirect('customer') @app.route('/logout') def logout(): # remove the username from the session if its there session.pop('username', None) return redirect('/') # サーバーへPDFをアップロードする @app.route('/send', methods=['GET', 'POST']) def send(): if request.method == 'POST': img_file = request.files['img_file'] if img_file and img_file.filename.endswith('.pdf'): #pdb.set_trace() saveFileName = path_( app.config['UPLOAD_FOLDER'],session['username'], secure_filename(img_file.filename)) if os.path.isfile(saveFileName): flash('ファイル名が重複しています。重複しないページのみを更新します。') else: img_file.save(saveFileName) else: flash('pdfファイルではありません') saveFileName = "" return render_template('index.html', upload_img_url=saveFileName) else: return redirect('/') def path_(a,b,c): d= os.path.join(a,b) return os.path.join(d,c) # サーバーへPattern をアップロードする @app.route('/pattern', methods=['GET', 'POST']) def pattern(): if request.method == 'POST': img_file = request.files['img_file'] if img_file and img_file.filename.endswith('.png'): saveFileName = os.path.join( app.config['UPLOAD_FOLDER'], datetime.now().strftime("%Y%m%d_%H%M%S_")+secure_filename(img_file.filename)) if os.path.isfile(saveFileName): flash('ファイル名が重複しています') saveFileName = "" else: img_file.save(saveFileName) conn = sqlite3.connect(app.config['DATABASE']) cur = conn.cursor() cur.execute("INSERT INTO response2(username,url,choose,circle,line) VALUES (?,?,?,?,?)", (session['username'], saveFileName, 1 , 10 , 6 )) conn.commit() conn.close() else: flash('pngファイルではありません') saveFileName = "" return redirect('/') else: return redirect('/') 中略 ##python app nonx ---> Format for Non-X without Fxx/Sxx ##python app ---> Format for X with Fxx/Sxx if __name__ == '__main__': app.config['USE_FxxSxx_NOTATION'] = True app.config['PORT']='8080' app.config['DATABASE']='members.db' app.config['ADMIN_PASS']="xxxx" ## X-USER if len(sys.argv)>=2: if sys.argv[1]=="nonx": app.config['USE_FxxSxx_NOTATION'] = False app.config['PORT'] = '8888' app.config['DATABASE']='members2.db' app.config['ADMIN_PASS']="xxxx" ## NONX-USER app.run('localhost', port=app.config['PORT'] ,debug=True)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

dodox86
dodox86

2020/02/14 01:12

「引き継ぐ」と言うのは、質問文中の(yuujiMotokiさんが書かれたと思しき)ご提示のコードを、別の人に渡す、と言うことでしょうか。
siruku6
siruku6

2020/02/14 02:50 編集

リファクタリングで動作が変わる恐れがあるということであれば、自分でリファクタリングするよりは、unittestだけ実装してあげてリファクタリングは引き継いだ相手にしてもらった方が安全でかつ、将来にわたってプラスになるような気がしました。 実際にリファクタリングで動かなくなるリスクも大幅に減らせます。 ただし、周囲の理解が得られるかはわかりません、、、 スマホしか現在使えず、ソース全体を見渡すのが難しいのでひとまずこれだけお伝えしてみます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。