【问题标题】:Pass Undefined Argument To Python Function [UX Driven]将未定义的参数传递给 Python 函数 [UX 驱动]
【发布时间】:2015-03-08 08:56:59
【问题描述】:

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

【问题讨论】:

  • 为什么你觉得你需要处理未定义的变量名?我真的不认为这是你定义的方式可以解决的。
  • 我同意你的看法。我只是想展示一个我一直在研究的解决方案。我认为任何解决方案都需要在全局命名空间中发生。也许我可以在全局命名空间中创建虚拟参数?
  • 您是否只是想在每次通话时保存几个引号?
  • 您正在尝试使用未定义的变量,您希望如何“解决”它?这些未定义的变量应该保持什么值?
  • 您每分钟输入plot(ax,'time','n1') 20 次?这令人印象深刻。

标签: python function interface arguments undefined


【解决方案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"

使用这种技术,您可以定义动态保持“它们自己的名称”的变量。

【讨论】:

  • 这是一个很好的解决方案。我还没有回答的是如何动态地做到这一点。感谢您的回复:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 2016-06-14
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多