Skip to content

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')
  1. 在这里,我们使用函数接口Function。大部分NBT-API都使用这个函数接口。

  2. 在这里,我们定义一个函数,本质上是传递给NBT-API的。NBT-API然后调用这个函数,将对应物品的NBT数据作为参数传递。然后,我们在函数内部获取我们想要的NBT数据,并从函数中返回。

  3. 在这里,我们初始化一个新的Function,将之前定义的nbt_get函数作为参数传递。

  4. 在这里,我们调用NBT-API,传递我们想要获取数据的物品以及之前创建的Function实例。然后,我们将返回的值(我们获取到的数据)赋值。

  5. 类似于之前,我们再次定义另一个函数,本质上是传递给NBT-API的。NBT-API调用此函数,传递对应物品的NBT数据。然后,我们在函数内部设置了NBT数据。这次我们不返回任何东西,因为我们是在设置数据,而不是获取数据。

  6. 在这里,我们初始化另一个新的Function,将之前定义的set_function函数作为参数传递。

  7. 最后,我们调用NBT-API来修改物品的NBT数据,传递我们想要设置NBT数据的物品以及之前创建的Function实例。NBT.modify函数不返回任何值,因为它修改值。

这只是一个相对简单的示例。如果您在处理更复杂的代码时遇到困难,请随时在PySpigot Discord上寻求帮助。 ```