允许用户扩展API

2024-06-02 08:45:01 发布

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

我正在为我的游戏编写一个modingapi,我想让用户告诉游戏引擎在API函数之前或之后运行他们的mod函数,换句话说就是“扩展”这些函数。在

在此之前,修改者必须重写函数以添加功能,这意味着挖掘游戏的源代码,我认为这对他们来说很糟糕。在

现在我在想这样的事情:

def moddersFunction():
    pass

myAPI.extendFunction('functionName', 'before-or-after', moddersFunction, extraArgs=[])

现在有什么比较干净的方法来实现这一点呢? {如果你想用其他的词来写,你会怎么写?在

我想买本字典myAPI.extendFunction将向添加函数,API中的函数将检查并运行mod的函数(如果已设置(“已注册”)。 但这意味着在我的modding API中添加检查字典的代码,我想允许它被扩展(即使它只是一个单独的函数调用,它本身也会进行检查和函数调用,但它本身似乎很强大)。在

我在想,是否有一些简单的Python技巧可以在不“屠宰”(也许我夸张了)游戏API的现有源代码的情况下“扩展”函数。在


Tags: 函数用户引擎功能apimod游戏字典
2条回答

我会按照以下思路做些事情:

class hookable(object):
  def __init__(self, fn):
    self.pre = []
    self.post = []
    self.fn = fn
  def add_pre(self, hook):
    self.pre.append(hook)
  def add_post(self, hook):
    self.post.append(hook)
  def __call__(self, *args, **kwargs):
    for hook in self.pre:
      hook(*args, **kwargs)
    ret = self.fn(*args, **kwargs)
    for hook in self.post:
      hook(*args, **kwargs)
    return ret

任何“可扩展”功能现在都可以这样装饰:

^{pr2}$

现在,您可以使用square.add_pre()square.add_post()注册函数,这些函数将在每次调用square()之前和之后自动被调用:

print square(2)

def pre(x): print 'pre', x
def post(x): print 'post', x

square.add_pre(pre)
print square(2)
print square(3)

square.add_post(post)
print square(4)
print square(5)

我可能想做点什么。显然,您实际做的是特定于您的需求的。在

class Extend(object):
    def __init__(self, original_function):
        self.original_function = original_function

    def __call__(self, function):
        def _wrapped(*args, **kwargs):
            yield function(*args, **kwargs)
            yield self.original_function(*args, **kwargs)
        return _wrapped

import time

@Extend(time.asctime)
def funky_time():
    return "This is the time in the UK"

print list(funky_time())

相关问题 更多 >