我想有一个绘图界面(我做绘图的Allllooottt),用户可以放入一个未定义的变量。
所需的界面
plot(ax,time,n1) # Returns Name Error
当前界面
plot(ax,'time','n1')
我知道这可能是一个很高的要求,但我很好奇Stack Overflow的天才是否能找到办法。到目前为止,我已经尝试过一个装饰器,但这不起作用,因为错误不会发生在函数中,它发生在调用函数中。尽管如此,我仍然对解决方案感兴趣......即使它很麻烦。
当前代码
def handleUndefined(function):
try:
return function
except NameError as ne:
print ne
except Exception as e:
print e
@handleUndefined
def plot(self,**args):
axesList = filter(lambda arg: isinstance(arg,p.Axes),args.keys())
parmList = filter(lambda arg: arg in self.parms, args.keys())
print axesList
print parmList
fig,ax = p.subplots()
plot(ax,time,n1)
我正在设计一个绘图界面,人们每秒可以绘制20个绘图,因此在这里给它们减少语法很重要。
答案 0 :(得分:1)
使用exec
被认为是邪恶的(或者至少是一种不好的做法),但这是我能够从运行时未知的字符串值动态设置变量的唯一方法:
strg = 'time' # suppose this value is received from the user via standard input
exec(strg + " = '" + strg + "'")
print time # now we have a variable called 'time' that holds the value of the string "time"
使用这种技术,您可以定义动态保存“自己的名字”的变量。
答案 1 :(得分:0)
所以我已经放弃了找到解决方案,但很低,看到我找到了解决方案。这并不明显,但我们可以依靠pythons魔术方法将这些变量实际链接到一个全局列表 all ,这是python找到变量的第一站。
我找到了一个解决方案,您可以使用@public装饰器向所有人添加内容: http://code.activestate.com/recipes/576993-public-decorator-adds-an-item-to-all/
从那里解决方案是这样的
@public
class globalVariable(str):
_name = None
def __init__(self,stringInput):
self._name = stringInput
self.__name__ = self._name
def repr(self):
return self._name
# Hopefully There's a strong correlation
xaxis = globalVariable('trees')
yaxis = globalVariable('forest')
#Booya lunchtime
plot(trees,forest)