Jython Decorators:不能强制第一个参数org.python.core.PyFunction函数

2024-10-01 13:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一种用Python编写CraftBukkit(Minecraft moded服务器软件)的方法。在

我用Jython加载一个Python脚本,然后使用事件的装饰器,等等

我目前正在实现事件装饰器,但是我有一个问题:没有参数的装饰器工作正常,但是只要我添加一个参数,它就会开始抱怨没有足够的参数。在

这是有效的:

@script.event
def test(event):
    print "hi" # Works

public void event(PyFunction func) {
    return func;
}

这不会:

^{pr2}$

以下是我的Java代码: http://pastebin.com/GsULYdJr


Tags: 方法test脚本event参数def事件script
1条回答
网友
1楼 · 发布于 2024-10-01 13:24:12

这和Jython无关。等效的纯Python代码显示了实际问题(为了简单起见,我省略了类或名称空间script):

def event(func, event_type, priority):
    # ...
    return func

@event("player.PlayerMoveEvent", "normal")
def test(event):
    print "player moved"

错误是

^{pr2}$

这是因为对装修师的误解。您希望装饰函数定义像这样执行

def test(event):
    print "player moved"

test = event(test, "player.PlayerMoveEvent", "normal")

但它是这样执行的:

__decorator = event("player.PlayerMoveEvent", "normal")

def test(event):
    print "player moved"

test = __decorator(test)

@后面的部分进行隔离计算,的结果被调用时使用test函数作为参数。Python中通常的修复方法是使用闭包,但在Java中这可能很麻烦。用Python编写decorator的一部分并保持Java代码不变可能是最简单的方法:

def script(event_type, priority):
    def decorate(func):
        return script.event(func, event_type, priority)
    return decorate

相关问题 更多 >