【发布时间】:2014-02-18 00:20:11
【问题描述】:
我听说 python 函数是对象,类似于列表或字典等。但是,用函数执行此类操作的类似方式是什么?
# Assigning empty list to 'a'
a = list()
# Assigning empty function to 'a'
a = lambda: pass
# ???
你会怎么做?此外,这是必要的还是适当的? 这是我想用它来获得更好的上下文的意义:
我有一个QListWidget 用于选择与字典中的键关联的项目。这本字典中的值也是字典,其中包含项目的某些属性,我可以添加这些属性。这些某些属性存储为键,并通过调用不同的函数来初始化或更新其中的值。因此,我在窗口中存储了一个变量,当按下按钮告诉该脚本要更新哪个属性时,该变量会更新。
如您所见,我想存储函数以根据情况使用正确的函数映射到数据。
# Get selection from the list
name = selected_item
# Initialize an empty function
f = lambda: pass
# Use property that is being added now, which was updated by the specific button that was pushed
property_list = items[name][self.property_currently_being_added]
if self.property_currently_being_added == "prop1":
f = make_property1()
elif self.property_currently_being_added == "prop2":
f = make_property2()
elif self.property_currently_being_added == "prop3":
f = make_property3()
elif self.property_currently_being_added == "prop4":
f = make_property4()
# map the certain function to the data which was retrieved earlier
added_property = map(f, data)
property_list.append(added_property)
【问题讨论】:
-
为什么你认为你需要一个“空”函数?您当然可以做到这一点,正如您所写的那样,但您为什么需要这样做?您的函数在尚未正确定义时是否会被调用?
-
我同意亨利的观点,似乎没有什么大理由要这样做。在您的示例中,您可以简单地执行
else: raise ValueError等。如果self.property_currently_being_added == None或what-have-you,您似乎不希望此功能继续。 -
另外,没有理由必须是 lambda。你可以很容易地写
def f(): pass,效果相同。使用lambda的唯一原因是(a)您不想给函数命名(此处不适用;您立即将其分配给f); (b) 你需要在一个表达式中定义它,而不是一个语句(这里不适用;你直接在赋值语句中使用它);或者 (c) 你正在和一位讨厌 Python 并且宁愿教授 Scheme 的教授上课(大概不适用于这里)。 -
你可以做一个身份函数。但是你真的用 lambda 找错了树。
-
只是为了好玩,如果你真的想要一个真正空函数对象,试试这个:
c = types.CodeType(0, 0, 0, 0, 0, b'', (), (), (), '<main>', 'f', 0, b''),然后f = types.FunctionType(c, {})。当然,这个函数所做的只是在被调用时引发一个SystemError……但是你期望一个空函数有多大用处? :)
标签: python function design-patterns