我正在尝试改进我的程序,使其符合良好的编程实践。因此,我正在寻找有关我编写某些东西的方式是否是一种好方法的建议。
我有一个名为 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
除了上述两个之外,还有其他函数和变量,但与本文无关。
在另一个文件中,我有一个功能:
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
函数将失败(并且可能会根据数据类型静默失败)。解决此问题的一种方法是定义:
paramvalues = [eval(x) for x in dbf.dbparams['tablecols']]
但是我听说通常使用它是一种不好的做法eval
(尽管我不知道为什么以及何时可以使用它)。我的问题是:
(i) 就我所关心的问题而言,我编写此代码的方式可以吗?我认为答案是否定的,但只是想在这里与专家核实一下。(ii) 使用eval
我所指出的可接受的解决方案吗?(iii) 如果对 (ii) 的回答是“否”,有什么替代方案?
感谢您阅读本文。