Javascript 在字典[Python]中存储函数
我目前正在构建一个应用程序,在这个应用程序中,我需要迭代一系列步骤,这些步骤基本上完成相同的工作,只需保存少量代码(~15行)。步骤的数量取决于项目的配置方式,因此为每个潜在实例创建单独的函数似乎有点傻 在JavaScript中,我会这样做:Javascript 在字典[Python]中存储函数,javascript,python,arrays,dictionary,data-structures,Javascript,Python,Arrays,Dictionary,Data Structures,我目前正在构建一个应用程序,在这个应用程序中,我需要迭代一系列步骤,这些步骤基本上完成相同的工作,只需保存少量代码(~15行)。步骤的数量取决于项目的配置方式,因此为每个潜在实例创建单独的函数似乎有点傻 在JavaScript中,我会这样做: var switches = [true, true, false, true]; var holder = { 0: function() { /* do step0 */ } 1: function() { /* do step1 *
var switches = [true, true, false, true];
var holder = {
0: function() { /* do step0 */ }
1: function() { /* do step1 */ }
2: function() { /* do step2 */ }
3: function() { /* do step3 */ }
// ...etc...
}
for (var i = 0; i < switches.length; i++)
if (switches[i])
holder[i]();
switches = [True, True, False, True]
class Holder(object):
@staticmethod
def do_0():
# do step0
@staticmethod
def do_1():
# do step 1
# ...etc...
def __repr__(self):
return [self.do_0, self.do_1, ...]
for action in Holder:
action()
如果我有大量的步骤,这看起来效率非常低。有没有更好的方法来解决这个问题?您可以按如下方式进行:
# define your functions
def fun1():
print("fun1")
def fun2():
print("fun2")
def fun3():
print("fun3")
switches = [True, False, True];
# put them in a list (list makes more sense than dict based on your example)
func_list = [fun1, fun2, fun3]
# iterate over switches and corresponding functions, and execute
# functions when s is True
for s,f in zip(switches, func_list):
if s: f()
这只是一种方式。还有很多其他的。e、 g.根据需要使用lambdas、dict等
若要在函数仅为一行时使用lambdas,可以执行以下操作:
func_list = [lambda: print("lambda1"),
lambda: print("lambda2"),
lambda: print("lambda1")]
简化代码
d = {0: lambda: 'Performing Step 0',
1: lambda: 'Performing Step 1',
2: lambda: 'Performing Step 2',
3: lambda: 'Performing Step 3',
4: lambda: 'Performing Step 4'}
for index, switch in enumerate([1, 0, 1, 1, 0]):
if switch == 1: d[index]()
在Python中似乎没有这样做的方法,这是一个故意做出的设计决策,因为它被认为是非Python的。哦,看来我一直在定义方法,然后手动将它们添加到列表中进行迭代
来源:我通常会这样做。 我喜欢这种方法,因为它为代码增加了最少的键入开销,而且如果以后编写了其他方法,则不需要在文件的其他地方修改任何内容
def steptest0():
code
def steptest1():
code
def steptest2():
code
...
tests = filter(lambda x: x.startswith('steptest'),
dir())
for t in tests: eval(t + '()')
在Python中,每个方法都已自动放入字典中,dir()
允许我们访问它
免责声明。一看到“eval”,普通行人狂热者的头脑中就开始响起多个警钟,有些人甚至会癫痫发作。让他们通过使用反射机制来避免eval(这可能会降低可读性,但仍然值得,因为他们不会被指责使用“eval”)。您的代码确实有效,但我试图避免在字典范围之外定义一堆函数。我可以使用我已有的代码。不幸的是,我正在使用的代码比示例要复杂得多,如果不快速使代码不可读,我无法真正定义一组函数。但是你不能把所有的东西都放在lambda中,Python没有像JS这样的匿名函数。是的,有s,但它们只限于一个表达式。是的,如果lambdas的限制稍微小一点就好了。不幸的是,对于一些更复杂的函数,我需要大约15行。@RobertIngrum,所以需要将它们分开。您可以使用这些函数创建一个模块,也可以像以前那样创建一个类。在我的实际示例中,Holder类实际上只是一个helper类,用于保存步骤处理器的所有设置。起初我也考虑过使用lambdas,但看起来它们不会太复杂(也就是说,它们不适用于15行代码)。装饰师可能更符合您的要求。做这件事的最佳方式是什么?如果我用同一个decorator定义所有函数,有没有简单的方法来循环它们而不创建循环列表?
def steptest0():
code
def steptest1():
code
def steptest2():
code
...
tests = filter(lambda x: x.startswith('steptest'),
dir())
for t in tests: eval(t + '()')