所以我正在开展一个有趣的化学项目,我有一个从文本文件初始化列表的函数。我想要做的是让函数替换为列表。所以这是我对它的第一次尝试,随机将会或将不会工作,我不知道为什么:
def periodicTable():
global periodicTable
tableAtoms = open('/Users/username/Dropbox/Python/Chem Project/atoms.csv','r')
listAtoms = tableAtoms.readlines()
tableAtoms.close()
del listAtoms[0]
atoms = []
for atom in listAtoms:
atom = atom.split(',')
atoms.append(Atom(*atom))
periodicTable = atoms
以这种方式调用它:
def findAtomBySymbol(symbol):
try:
periodicTable()
except:
pass
for atom in periodicTable:
if atom.symbol == symbol:
return atom
return None
有没有办法让这项工作?
答案 0 :(得分:4)
不要那样做。正确的做法是使用一个装饰器来确保函数只执行一次并缓存返回值:
def cachedfunction(f):
cache = []
def deco(*args, **kwargs):
if cache:
return cache[0]
result = f(*args, **kwargs)
cache.append(result)
return result
return deco
@cachedfunction
def periodicTable():
#etc
也就是说,在调用函数之后没有什么能阻止你更换函数本身,所以你的方法通常应该有效。我认为它之所以不是因为在将结果分配给periodicTable
之前抛出异常,因此它永远不会被替换。尝试删除try/except
阻止或用except
替换毯子except TypeError
,看看到底发生了什么。
答案 1 :(得分:3)
这是非常糟糕的做法。
如果已经加载了表格,那么更好的是记住你的功能:
def periodicTable(_table=[]):
if _table:
return _table
tableAtoms = open('/Users/username/Dropbox/Python/Chem Project/atoms.csv','r')
listAtoms = tableAtoms.readlines()
tableAtoms.close()
del listAtoms[0]
atoms = []
for atom in listAtoms:
atom = atom.split(',')
atoms.append(Atom(*atom))
_table[:] = atoms
前两行检查表是否已经加载,如果已经加载,则只返回它。