将未定义的参数传递给Python函数[UX Driven]

时间:2015-01-09 23:04:06

标签: python function interface arguments undefined

我想有一个绘图界面(我做绘图的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个绘图,因此在这里给它们减少语法很重要。

2 个答案:

答案 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)