優れたプログラミング手法に準拠するようにプログラムを改善しようとしています。だから私は何かをプログラムした方法がそれを行う良い方法であるかどうかについての提案を探しています.
私が定義した dbfunctions.py というモジュールがあります。
dbparams = {
'dbname': 'qualitysimparams',
'tablename': 'qualityparams',
'tablecols': ('numpeople', 'numreviews', 'prophunters',
'utility_funcform', 'goods'
)
そして関数:
def obtainid_ifrecord(dbname, tablename, tablecols, values):
'''Checks if there already exists a record with given <values>.
If so, returns the id of that record, otherwise returns zero.'''
con, c = connecttodb()
q1 = "use {0}".format(dbname)
c.execute(q1)
q2p1 = "select id from {0} ".format(tablename)
q2p2 = "where " + " = %s and ".join(tablecols) + " = %s"
q2 = q2p1 + q2p2
c.execute(q2, values)
res = c.fetchall()
c.close()
con.close()
if res:
return res[-1][0]
else:
return 0
上記の 2 つ以外にも関数と変数がありますが、この投稿には関係ありません。
別のファイルに関数があります:
def checkif_paramcomboexists(numpeople, numreviews, prophunters,
utility_funcform, goods):
'''Check in the database if the simulation has been run with the
specified parameters. If so return the id of that run.
'''
goodsjson = sjson.dumps(goods)
# paramvalues: in same order as listed in dbf.dbparams['tablecols']
paramvalues = (numpeople, numreviews, prophunters,
utility_funcform, goodsjson)
id = dbf.obtainid_ifrecord(dbf.dbparams['dbname'],
dbf.dbparams['tablename'],
dbf.dbparams['tablecols'],
paramvalues)
return id
paramvalues
関数内の変数で変数名をハードコーディングすること
checkif_paramcomboexists
は良い習慣ではないように思えます。後で何らかの理由で dbfunctions.dbparams['tablecols'] の変数の順序を変更すると、checkif_paramcomboexists
関数は失敗します (データ型によってはサイレントに失敗する可能性があります)。これを回避する 1 つの方法は、次のように定義することです。
paramvalues = [eval(x) for x in dbf.dbparams['tablecols']]
しかし、一般的に使用するのは悪い習慣だと聞いたことがありますeval
(ただし、いつ使用してもよい理由はわかりません)。私の質問は次のとおりです。
(i) 私が抱えている懸念に関して、これをコード化した方法でよろしいですか? 答えは「いいえ」だと思いますが、ここで専門家に確認したいだけです。(ii)eval
私が示したような使用は容認できる解決策ですか? (iii) (ii) の答えが「いいえ」の場合、代替手段は何ですか?
これを読んでいただきありがとうございます。