我进行科学编程,经常想向用户显示提示和变量对,让他们编辑变量,然后用新变量进行计算。我经常这样做,所以我编写了一个 wxPython 类来将此代码移出主程序。您为每个变量设置一个列表,其中包含变量的类型(字符串、浮点数、整数)、提示和变量的当前值。然后,您将所有这些列表放在一个大列表中,我的实用程序将创建一个格式整齐的 wxPython 面板,其中包含提示和可以编辑的当前值。

当我开始时,我只有几个变量,所以我会写出每个变量。

s='this is a string'; i=1; f=3.14
my_list=[ ['s','your string here',s], ['i','your int here',i], ['f','your float here'],]
input_panel = Input(my_list)

 # the rest of the window is created, the input_panel is added to the window, the user is
 # allowed to make  choices, and control returns when the user hits the calculate button

s,i,f = input_panel.results()     # the .results() function returns the values in a list

现在我想对很多变量(10-30)使用这个例程,但这种方法正在崩溃。我可以使用 list.append() 语句在多行上创建函数的输入列表。然而,当代码从函数返回时,我得到了这个巨大的列表,需要将其解压缩到正确的变量中。这很难管理,而且看起来很容易导致输入列表和输出列表不同步。更糟糕的是,它看起来很笨拙。

在Python中将大量变量传递给带有额外信息的函数以便可以编辑它们,然后取回变量以便我可以在程序的其余部分中使用它们的最佳方法是什么?

如果我可以通过引用将变量传递到函数中,那么用户可以更改或不更改它们,并且一旦程序从函数返回,我就会使用这些值。我只需要在多行上构建输入列表,并且输入列表不会与输出列表不同步。但Python不允许这样做。

我是否应该将大列表分解为较小的列表,然后将其组合成大列表以传入和传出函数?或者这只是增加了更多出错的地方?

有帮助吗?

解决方案

做最简单的事情是创建一个类。而不是处理的变量列表,类将具有属性。然后你只需要使用类的一个实例。

其他提示

有那首先想到的两个像样的选项。

第一种方法是使用字典来收集所有的变量在一个地方:

d = {}
d['var1'] = [1,2,3]
d['var2'] = 'asdf'
foo(d)

第二个是使用类捆绑的所有参数。这可能是简单的东西为:

class Foo(object):
    pass
f = Foo()
f.var1 = [1,2,3]
f.var2 = 'asdf'
foo(f)

在这种情况下,我宁愿类在字典中,仅仅是因为你最终可以定义为类,以使其更清晰的使用或提供处理一些打包和拆包工作方法。

要我,理想的解决方案是使用一类这样的:

>>> class Vars(object):
...     def __init__(self, **argd):
...             self.__dict__.update(argd)
...
>>> x = Vars(x=1, y=2)
>>> x.x
1
>>> x.y
2

您也可以建立一个字典,并将其传递是这样的:

>>> some_dict = {'x' : 1, 'y' : 2}
>>> #the two stars below mean to pass the dict as keyword arguments
>>> x = Vars(**some_dict)  
>>> x.x
1
>>> x.y
2

您然后可以获取数据或改变它作为需要的话将它传递给功能时:

>>> def foo(some_vars):
...     some_vars.z = 3 #note that we're creating the member z
...
>>> foo(x)
>>> x.z
3

如果我可以通过引用将变量传递到函数中,那么用户可以更改或不更改它们,并且一旦程序从函数返回,我就会使用这些值。

通过传递一个参数,您可以获得与“按引用传递”大致相同的效果 dict (或者为了语法方便 Bunch, , 看 http://code.activestate.com/recipes/52308/).

如果你有一个有限集的这些情况下,可以编写为每一个特定的包装函数。每个包装会做建设和拆包传递给内部函数taht名单的工作。

  1. 我建议使用词典或班级来积累有关变量的所有详细信息
    • 价值
    • 提示文字
  2. 用于存储您希望它们显示的顺序的列表
  3. 然后使用旧的迭代来准备输入并收集输出

这样,您只需一次又一次地修改代码的一小部分可管理的部分。当然,如果您习惯使用类,则应该将所有这些封装到一个类中。

"""Store all variables
"""
vars = {}
"""Store the order of display
"""
order = []

"""Define a function that will store details and order of the variable definitions
"""
def makeVar(parent, order, name, value, prompt):
    parent[name] = dict(zip(('value', 'prompt'), (value, prompt)))
    order.append(name)

"""Create your variable definitions in order
"""
makeVar(vars, order, 's', 'this is a string', 'your string here')
makeVar(vars, order, 'i', 1, 'your int here')
makeVar(vars, order, 'f', 3.14, 'your float here')

"""Use a list comprehension to prepare your input
"""
my_list = [[name, vars[name]['prompt'], vars[name]['value']] for name in order]
input_panel = Input(my_list)

out_list = input_panel.results();
"""Collect your output
"""
for i in range(0, len(order)):
    vars[order[i]]['value'] = out_list[i];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top