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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

304閲覧

Pythonにてほぼ名前の違うクラスのメソッドを使う際に変数を動的に切り替える方法

kobakazu

総合スコア9

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/26 01:26

編集2022/01/12 10:55

現状

現在flaskpeeweeというormライブラリを使用しています。
その際にカラム名が違うだけのクラスが多く存在し、クラスを作る際にはif文で無理矢理条件分岐後に変数に代入して、それを利用する形で書いています。

#1つめの問題

python

1def return_this(foreign): 2 if (foreign == 'types'): 3 return [Type(), 'type'] 4 elif (foreign == 'groups'): 5 return [Group(), 'group'] 6 elif (foreign == 'categories'): 7 return [Category(), 'category'] 8 elif (foreign == 'formats'): 9 return [Format(), 'format'] 10 elif (foreign == 'attributes'): 11 return [Attribute(), 'attribute'] 12 else: 13 return 14 15 16def get_foreign(foreign): 17 data = [] 18 19 this = return_this(foreign) 20 this_Class = this[0] 21 22 for x in this_Class.select().order_by(this_Class.id).dicts(): 23 data.append(x) 24 25 return jsonify(data)

これを綺麗に書く方法はありますでしょうか?

#2つめの問題

python

1def post_foreign(foreign, request): 2 this = return_this(foreign) 3 this_Class = this[0] 4 key = this[1] 5 6 this_Class.create( 7 type=request.form[key], ---8 created_at=datetime.datetime.now(), 9 updated_at=datetime.datetime.now() 10 ) 11 12 return returnResultCreate()

①の部分でtypeの部分を動的に変えたいと思っています。
値自体はreturn_this()の返り血がlistになっており、index 1に格納されているためそれを使えれば良いのですが、変数展開のようなものができません。
思いついたものはexec()eval()ですがこのようなものは使用したくありません。
どうにか対処方法を教えてください。

追記(2つめの問題)

python

1def post_foreign(foreign, request): 2 if (foreign == 'types'): 3 Type.create( 4 type=request.form['type'], 5 created_at=datetime.datetime.now(), 6 updated_at=datetime.datetime.now() 7 ), 8 elif (foreign == 'groups'): 9 Group.create( 10 group=request.form['group'], 11 created_at=datetime.datetime.now(), 12 updated_at=datetime.datetime.now() 13 ), 14 elif (foreign == 'categories'): 15 Category.create( 16 category=request.form['category'], 17 created_at=datetime.datetime.now(), 18 updated_at=datetime.datetime.now() 19 ), 20 elif (foreign == 'formats'): 21 Format.create( 22 format=request.form['format'], 23 created_at=datetime.datetime.now(), 24 updated_at=datetime.datetime.now() 25 ), 26 elif (foreign == 'attributes'): 27 Attribute.create( 28 attribute=request.form['attribute'], 29 created_at=datetime.datetime.now(), 30 updated_at=datetime.datetime.now() 31 ), 32 else: 33 return returnError404() 34 35 return returnResultCreate()

わかりづらく申し訳ありませんでした。
正確には、上記のようにType, Group, Category, Format, Attributeとその中身の一部が違うだけで基本は同じです。
このコードのメンテナンスコストとタイプ量を減らしたいと考えています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2018/07/26 03:26

カラム名が違うだけのクラスとおっしゃっていますが、テーブルが多くあればある意味やむを得ないと思います。この部分での課題認識がいまいちよくわかりません。インスタンス生成部分を綺麗にとはどのような観点での綺麗さを望むのでしょうか。タイプが楽なのかメンテコストが低いのが良いのか、、。2つ目の問題では変数展開に言及されておりますが、ほぼ共通化できるのだけれど、例外があるのでもうすこし柔軟にしたいという意図でしょうか?
guest

回答1

0

テーブルをまとめて扱うメリットを見出せない(これだとメンテナンスコストもタイプ量も削減出来ないと思う)のですが、インスタンス生成をある程度共通化する方法として一例を以下に示します。
Table関数内部にあるinstディクショナリでまとめたものになります。
共通コードが増えてしまうのであれば、テーブル構成をまずは見直した方が良さそうにも思いますし、ヘルパ関数などを適宜利用すれば良いようにも思います。

python

1 2class Person(Model): 3 name = CharField() 4 birthday = DateField() 5 created_at = datetime.now() 6 7 class Meta: 8 database = db # This model uses the "people.db" database. 9 10class Pet(Model): 11 owner = ForeignKeyField(Person, backref='pets') 12 name = CharField() 13 animal_type = CharField() 14 created_at = datetime.now() 15 16 class Meta: 17 database = db # this model uses the "people.db" database 18 19from datetime import date 20def Table(name,owner=None): 21 inst = { 22 'Bob': {'obj': Person, 'date': date(1960,1,15)}, 23 'Granma': {'obj': Person, 'date': date(1935,3,1)}, 24 'Kitty': {'obj': Pet, 'type': 'cat'}, 25 } 26 27 if name not in inst: 28 print('unkown name', name) 29 return None 30 31 ins = inst[name] 32 if ins['obj'].__name__ == 'Person': 33 print('person init') 34 return ins['obj'](name=name, birthday=ins['date']) 35 else: 36 if owner is None: 37 print('owner is None.. ;;') 38 print('Pet init') 39 return ins['obj'](owner=owner,name=name, animal_type=ins['type']) 40 41uncle_bob = Table('Bob') 42print(type(uncle_bob)) 43print('name is ', uncle_bob.name) 44 45bob_kitty = Table('Kitty',uncle_bob) 46print('bob_kitty ',type(bob_kitty)) 47print('myname is ', bob_kitty.name) 48print("owner name: ", bob_kitty.owner.name)

投稿2018/07/26 07:42

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問