gpt4 book ai didi

java - Jython 装饰器 : 1st arg can't be coerced to org. python.core.PyFunction

转载 作者:行者123 更新时间:2023-12-01 04:16:54 25 4
gpt4 key购买 nike

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

我通过使用 Jython 加载 Python 脚本,然后使用事件装饰器等来实现此目的。

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

这有效:

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

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

这不会:

@script.event("player.PlayerMoveEvent", "normal")
def test(event):
print "player moved!" # TypeError: event(): 1st arg can't be coerced to org.python.core.PyFunction

public void event(PyFunction func, PyString eventType, PyString priority) {
// Do all kinds of crap
return func;
}

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

最佳答案

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

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

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

错误是

Traceback (most recent call last):
...
TypeError: event() missing 1 required positional argument: priority

这是由于对装饰器的误解造成的。您期望装饰函数定义像这样执行

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)

@ 后面的部分是单独计算的,that 的结果是用 test 函数作为参数调用的。 Python 中的正常修复方法是使用闭包,但这在 Java 中可能很麻烦。最简单的方法可能是用 Python 编写部分装饰器并保留当前的 ​​Java 代码:

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

关于java - Jython 装饰器 : 1st arg can't be coerced to org. python.core.PyFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com