function.py 辅助模块
为了方便起见,PySpigot包括了一个名为 function.py 的辅助模块。该模块将java.util.function包中包含的几个函数接口封装成适合Python的格式。
当Java的API/库利用这些功能接口时,这个模块极大地简化了与Java的功能接口一起工作的难度。例如,NBT-API大量使用了功能接口,而 function.py 辅助模块则大大简化了操作。请查看使用示例部分以了解如何在NBT-API中使用此模块的示例。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 | """
这是一个辅助模块,将`java.util.function`包中多种功能接口封装起来,以便在Python中更轻松地使用。
当与一些使用功能接口的库一起工作时,此模块应特别有用(如NBT-API)。
"""
import java.util.function.BiConsumer
import java.util.function.BiFunction
import java.util.function.BiPredicate
import java.util.function.Consumer
import java.util.function.Function
import java.util.function.Predicate
import java.util.function.Supplier
"""
表示接受两个输入参数并返回无结果的操作。这是Consumer的双元特化。与大多数其他功能接口不同,BiConsumer预计将通过副作用运行。
"""
class BiConsumer(java.util.function.BiConsumer):
"""
初始化一个新的BiConsumer。
```python
参数:
function (callable): 一个接受两个参数并且不返回任何值的函数。
"""
def __init__(self, function):
self.accept = function
"""
表示一个接受两个参数并且产生结果的函数。这是 Function 的双参专用化。
"""
class BiFunction(java.util.function.BiFunction):
"""
初始化一个新的 BiFunction。
参数:
function (callable): 一个接受两个参数并且返回一个值的函数。
"""
def __init__(self, function):
self.apply = function
"""
表示一个接受两个参数并且返回布尔值的函数。这是 Predicate 的双参专用化。
"""
class BiPredicate(java.util.function.BiPredicate):
"""
初始化一个新的 BiPredicate。
参数:
function (callable): 一个接受两个参数并且返回 True 或 False 的函数。
"""
def __init__(self, function):
self.test = function
"""
表示一个接受单个输入参数并且不返回结果的操作。与大多数其他功能接口不同,Consumer 期望通过副作用来操作。
"""
class Consumer(java.util.function.Consumer):
"""
初始化一个新的 Consumer。
参数:
function (callable): 一个接受一个参数并且不返回任何值的函数。
"""
def __init__(self, function):
self.accept = function
"""
表示一个接受一个参数并且产生结果的函数。
"""
class Function(java.util.function.Function):
"""
初始化一个新的 Function。
参数:
function (callable): 一个接受一个参数并且返回一个值的函数。
"""
def __init__(self, function):
self.apply = function
"""
表示具有一个参数的谓词(布尔值函数)。
"""
class Predicate(java.util.function.Predicate):
"""
初始化一个新的Predicate。
参数:
function (callable): 接受一个参数并返回True或False的函数。
"""
def __init__(self, function):
self.test = function
"""
表示结果的提供者。
没有要求每次调用供应者时都返回一个新的或不同的结果。
"""
class Supplier(java.util.function.Supplier):
"""
初始化一个新的Supplier。
参数:
function (callable): 接受无参数并返回一个值的函数。
"""
def __init__(self, function):
self.get = function
|
使用示例
以下代码使用NBT-API通过命令向物品设置自定义NBT字符串,然后当玩家与手中的物品交互时获取自定义NBT字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | import pyspigot as ps
from function import Function # (1)!
from de.tr7zw.nbtapi import NBT
from org.bukkit.event.player import PlayerInteractEvent
def interact_event(event):
item = event.getItem()
if item is not None:
def nbt_get(nbt): # (2)!
return nbt.getString("Test_String")
nbt_get_function = Function(nbt_get) # (3)!
nbt_data = NBT.get(item, nbt_get_function) # (4)!
print(nbt_data)
ps.listener_manager().registerListener(interact_event, PlayerInteractEvent)
def command(sender, label, args):
item = sender.getItemInHand()
to_set = '这是一个测试字符串'
def set_function(nbt): # (5)!
nbt.setString("Test_String", to_set)
set_function = Function(set_function) # (6)!
NBT.modify(item, set_function) # (7)!
ps.command_manager().registerCommand(command, 'additemnbt')
|
-
在这里,我们使用函数接口Function。大部分NBT-API都使用这个函数接口。
-
在这里,我们定义一个函数,本质上是传递给NBT-API的。NBT-API然后调用这个函数,将对应物品的NBT数据作为参数传递。然后,我们在函数内部获取我们想要的NBT数据,并从函数中返回。
-
在这里,我们初始化一个新的Function,将之前定义的nbt_get函数作为参数传递。
-
在这里,我们调用NBT-API,传递我们想要获取数据的物品以及之前创建的Function实例。然后,我们将返回的值(我们获取到的数据)赋值。
-
类似于之前,我们再次定义另一个函数,本质上是传递给NBT-API的。NBT-API调用此函数,传递对应物品的NBT数据。然后,我们在函数内部设置了NBT数据。这次我们不返回任何东西,因为我们是在设置数据,而不是获取数据。
-
在这里,我们初始化另一个新的Function,将之前定义的set_function函数作为参数传递。
-
最后,我们调用NBT-API来修改物品的NBT数据,传递我们想要设置NBT数据的物品以及之前创建的Function实例。NBT.modify函数不返回任何值,因为它修改值。
这只是一个相对简单的示例。如果您在处理更复杂的代码时遇到困难,请随时在PySpigot Discord上寻求帮助。
```