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

Pass Undefined Argument To Python Function [UX Driven]

我想要一个绘图界面(我做了 Allllooottt of plotting),用户可以在其中输入未定义的变量。

所需界面

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 个绘图/分钟,因此在这里为他们提供更少的语法很重要。

使用 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"

使用此技术,您可以定义将动态保持 "their own name" 的变量。

所以我已经放弃寻找解决方案,但很低,我找到了解决方案。这并不明显,但我们可以依靠 python 的魔法方法将这些变量实际 link 放入全局列表 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)