刚开始测试optapy,我在尝试使用optapy、groupBy和sum时出错了:
TypeError:“函数”对象不可迭代
可能是为了求和的理由。有什么帮助吗?
def lecturer_teaching_load(constraint_factory: ConstraintFactory):
print("Restricting by Teaching Load")
return constraint_factory.forEach(SubjectClass) \
.groupBy(lambda subject: subject.lecturer, sum(lambda subject: subject.teaching_load)) \
.filter(lambda lecturer, load: lecturer.real_cap > load) \
.penalize("Capacity conflict", HardSoftScore.ONE_HARD)如果为同一位讲师计划的课程太多,就会受到惩罚。
发布于 2022-01-14 18:02:39
这里的主要问题是您使用的是内置的python sum函数(它需要一个可迭代的,并返回一个数字),而不是ConstraintCollectors.sum函数(它接受一个函数,并返回一个ConstraintCollector)。
JPype目前无法在没有显式强制转换的情况下区分函数重载,因此目前需要在和内将lambda转换为适当的类型(在本例中为java.util.function.ToIntFunction)。这是为Joiners自动完成的,但对于ConstraintCollectors则不是这样(ConstraintCollectors在不同的地方使用各种不同的类型,这使得在不重复API的情况下自动化过程变得更加困难)。这一守则应适用于:
from optapy.constraint import ConstraintCollectors
from java.util.function import ToIntFunction
def lecturer_teaching_load(constraint_factory: ConstraintFactory):
print("Restricting by Teaching Load")
return constraint_factory.forEach(SubjectClass) \
.groupBy(lambda subject: subject.lecturer, ConstraintCollectors.sum(ToIntFunction @ (lambda subject: subject.teaching_load))) \
.filter(lambda lecturer, load: lecturer.real_cap > load) \
.penalize("Capacity conflict", HardSoftScore.ONE_HARD)https://stackoverflow.com/questions/70507127
复制相似问题