hacks,一个不按规则出牌的Python插件库
项目描述
hacks,一个不按规则出牌的Python插件库
=============================================================
一句话介绍
---------------
`hacks`的目标是成为一款将面向方面方法引入Python程序的插件库。
关于
-----
`hacks`是关于什么的?让我看看...
`hacks`是关于在角落里偷袭一个完全陌生人的腿。
悄悄地。模块化地。痛苦地。
`hacks`是关于修补你被允许修补的对象,
然后修补一切。
`hacks`是关于从远处钩入其他代码。
`hacks`是关于修改和扩展你甚至没有引用的函数
。
`hacks`是关于扩展你永远不会看到的类
及其你永远不会遇到的存在实例。
按你的喜好。毫不费力。以及即将到来的厄运感。
而`hacks`是关于用单一缩进清理所有混乱。
用法
-----
```python
import hacks
# Hacks可以用作简单的调用分配器
def main_code()
N = 2
for i in range(N)
# 调用所有钩入'explicit_call'的对象
hacks.call.explicit_call(i)
# ...
@hacks.into('explicit_call') # 对main_code一无所知
def plugin1(i)
print(i)
class Plugin2
@hacks.into('explicit_call')
@hacks.stealing # 很遗憾他们忘记了暴露N
def method(self, i, N=hacks.steal)
print(i, 'of', N)
# ...
with hacks.use(plugin1, Plugin2)
main_code() # 打印'0', '0 of 2', '1', '1 of 2'
main_code() # 不打印任何内容
# Hacks可以用来修改@hacks.friendly对象,例如包装函数
@hacks.friendly # 未指定名称,传递'greeter'给@hacks.around
def greeter()
return 'Hello!'
# ...
@hacks.around('greeter')
def reverse(func)
def func_reversed()
return func()[::-1]
return func_reversed
# ...
with hacks.use(reverse): # 反转所有'printer's
print(greeter()) # 打印 '!olleH'
print(greeter()) # 打印 'Hello!'
对扩展类和透明地修改现有实例以使用更新版本提供了特殊支持
提供了特殊支持,以便扩展类和修改现有实例以使用更新版本透明地
@hacks.friendly_class # 名称未指定,传递 'Clock' 到 @hacks.up
class Clock
def __init__(self, text)
self._text = text
def tick(self)
返回 self._text
# ...
@hacks.up('Clock')
def tockify(clock_class)
class TockingClock
def tick(self)
返回 self._text + '-tock'
返回 TockingClock
# ...
ticker = Clock('tick')
print(ticker.tick()) # 打印 'tick'
with hacks.use(tockify): # 将所有 'clock' 转换为 tock
print(ticker.tick()) # 打印 'tick-tock'
是的,ticker 已经透明地将其类更改为 TockingClock。
print(ticker.tick()) # 打印 'tick'
现在它又变回了一个普通的 Clock!
```
还有更多:初始化器、析构器、修改自定义对象以及
使不合作的对象合作。
但最伟大的特性是 hacks.use,它优雅地启用和禁用 hacks
而不会改变它们在该块或线程之外的行为。
它可以嵌套,它可以被覆盖,它污染调用堆栈
并在块的末尾自行清理。这不是很好吗?
请参阅 `tests` 目录以获取更多强大的用法示例。
嗯,使用 `hacks` 扩展代码太明显了!
-------------------------------------------------
啊,你感兴趣的对象没有被装饰吗?
没问题,使用 @hacks_friendly 进行猴子补丁
```python
sys.stdin = hacks_friendly(sys.stdin)
```
这本身应该几乎没有任何可见效果。
现在可以使用 `hacks.use(...)` 修改、包装和扩展它,
而不必担心其他线程或自己清理。
嗯,使用 `hacks` 扩展代码太隐晦了!
-------------------------------------------------
当你用 `@hacks.friendly`/`friendly_class` 装饰某物时,
你几乎可以将其从所有合同中解放出来。
你永远不知道下一次访问时会是什么。
但嘿,任何装饰器都是自定义修改,你期待什么呢?
顺便说一句,那个责任负担并没有简单地消失,
它只是扩散到了 `@hacks.up` 和 `around` 你的代码的人。
如果你反对“窃取”,那就简单地不要“窃取”。
这究竟是一个插件系统吗?
----------------------------------------
它可以作为一个使用。
编写一些代码。
使用 `@hacks.friendly` 和 `@hacks.friendly_class` 装饰它,
并搭配好名字。
在适当的地方使用 `hacks.call` 添加对插件显式调用的调用。
想想一个新的方面,比如日志记录。
编写日志代码,将 `@hacks.into` 显式插件调用。
围绕整个函数包装以添加更多日志。
如果你想要,可以修改类。
然后执行你的代码 `with hacks.use(logging):`。
享受你的可插拔、可替换、分离的日志,
而不会太多地污染原始代码。
编写更多强大和变革性的修改,
而不必触及主代码。
堆叠、嵌套并应用多个 hacks... 嗯,插件。
灵活地定义它们的 '作用域'。
如果没有充分的理由,不要破坏原始对象的合同。
你还需要插件系统做什么?
为插件自动发现集成 Setuptools,对吧。
虽然它计划在未来版本中实现,但欢迎 pull requests!
那么插件接口是什么?插件需要一个严格的接口!
----------------------------------------------------------------
在 Pythonland 不是这样。
如果你不同意我,你可能是一个有趣而奇怪的人,
可能应该看看 https://github.com/pytest-dev/pluggy
选择名称迫使你设计一个接口!
----------------------------------------------------------
真的吗?多么难以忍受。
只是将所有 hacks 钩接到 'x' 上,我真正的无政府主义者。
不过,祝你好运,区分对象吧!
安装(大致)
--------------------------
从 pypi
pip3 install hacks
从 Github
pip3 install git+https://github.com/t184256/hacks.git
从本地源
pip3 install -r requirements.txt
python3 setup.py install
更多
----
`hacks` 给一个
名为 `mutants` 的通用对象代理库。
查看它:https://github.com/t184256/mutants
许可证
-------
`hacks` 在 MIT 许可证的条款下分发;
参见 [LICENSE.txt](LICENSE.txt)。
=============================================================
一句话介绍
---------------
`hacks`的目标是成为一款将面向方面方法引入Python程序的插件库。
关于
-----
`hacks`是关于什么的?让我看看...
`hacks`是关于在角落里偷袭一个完全陌生人的腿。
悄悄地。模块化地。痛苦地。
`hacks`是关于修补你被允许修补的对象,
然后修补一切。
`hacks`是关于从远处钩入其他代码。
`hacks`是关于修改和扩展你甚至没有引用的函数
。
`hacks`是关于扩展你永远不会看到的类
及其你永远不会遇到的存在实例。
按你的喜好。毫不费力。以及即将到来的厄运感。
而`hacks`是关于用单一缩进清理所有混乱。
用法
-----
```python
import hacks
# Hacks可以用作简单的调用分配器
def main_code()
N = 2
for i in range(N)
# 调用所有钩入'explicit_call'的对象
hacks.call.explicit_call(i)
# ...
@hacks.into('explicit_call') # 对main_code一无所知
def plugin1(i)
print(i)
class Plugin2
@hacks.into('explicit_call')
@hacks.stealing # 很遗憾他们忘记了暴露N
def method(self, i, N=hacks.steal)
print(i, 'of', N)
# ...
with hacks.use(plugin1, Plugin2)
main_code() # 打印'0', '0 of 2', '1', '1 of 2'
main_code() # 不打印任何内容
# Hacks可以用来修改@hacks.friendly对象,例如包装函数
@hacks.friendly # 未指定名称,传递'greeter'给@hacks.around
def greeter()
return 'Hello!'
# ...
@hacks.around('greeter')
def reverse(func)
def func_reversed()
return func()[::-1]
return func_reversed
# ...
with hacks.use(reverse): # 反转所有'printer's
print(greeter()) # 打印 '!olleH'
print(greeter()) # 打印 'Hello!'
对扩展类和透明地修改现有实例以使用更新版本提供了特殊支持
提供了特殊支持,以便扩展类和修改现有实例以使用更新版本透明地
@hacks.friendly_class # 名称未指定,传递 'Clock' 到 @hacks.up
class Clock
def __init__(self, text)
self._text = text
def tick(self)
返回 self._text
# ...
@hacks.up('Clock')
def tockify(clock_class)
class TockingClock
def tick(self)
返回 self._text + '-tock'
返回 TockingClock
# ...
ticker = Clock('tick')
print(ticker.tick()) # 打印 'tick'
with hacks.use(tockify): # 将所有 'clock' 转换为 tock
print(ticker.tick()) # 打印 'tick-tock'
是的,ticker 已经透明地将其类更改为 TockingClock。
print(ticker.tick()) # 打印 'tick'
现在它又变回了一个普通的 Clock!
```
还有更多:初始化器、析构器、修改自定义对象以及
使不合作的对象合作。
但最伟大的特性是 hacks.use,它优雅地启用和禁用 hacks
而不会改变它们在该块或线程之外的行为。
它可以嵌套,它可以被覆盖,它污染调用堆栈
并在块的末尾自行清理。这不是很好吗?
请参阅 `tests` 目录以获取更多强大的用法示例。
嗯,使用 `hacks` 扩展代码太明显了!
-------------------------------------------------
啊,你感兴趣的对象没有被装饰吗?
没问题,使用 @hacks_friendly 进行猴子补丁
```python
sys.stdin = hacks_friendly(sys.stdin)
```
这本身应该几乎没有任何可见效果。
现在可以使用 `hacks.use(...)` 修改、包装和扩展它,
而不必担心其他线程或自己清理。
嗯,使用 `hacks` 扩展代码太隐晦了!
-------------------------------------------------
当你用 `@hacks.friendly`/`friendly_class` 装饰某物时,
你几乎可以将其从所有合同中解放出来。
你永远不知道下一次访问时会是什么。
但嘿,任何装饰器都是自定义修改,你期待什么呢?
顺便说一句,那个责任负担并没有简单地消失,
它只是扩散到了 `@hacks.up` 和 `around` 你的代码的人。
如果你反对“窃取”,那就简单地不要“窃取”。
这究竟是一个插件系统吗?
----------------------------------------
它可以作为一个使用。
编写一些代码。
使用 `@hacks.friendly` 和 `@hacks.friendly_class` 装饰它,
并搭配好名字。
在适当的地方使用 `hacks.call` 添加对插件显式调用的调用。
想想一个新的方面,比如日志记录。
编写日志代码,将 `@hacks.into` 显式插件调用。
围绕整个函数包装以添加更多日志。
如果你想要,可以修改类。
然后执行你的代码 `with hacks.use(logging):`。
享受你的可插拔、可替换、分离的日志,
而不会太多地污染原始代码。
编写更多强大和变革性的修改,
而不必触及主代码。
堆叠、嵌套并应用多个 hacks... 嗯,插件。
灵活地定义它们的 '作用域'。
如果没有充分的理由,不要破坏原始对象的合同。
你还需要插件系统做什么?
为插件自动发现集成 Setuptools,对吧。
虽然它计划在未来版本中实现,但欢迎 pull requests!
那么插件接口是什么?插件需要一个严格的接口!
----------------------------------------------------------------
在 Pythonland 不是这样。
如果你不同意我,你可能是一个有趣而奇怪的人,
可能应该看看 https://github.com/pytest-dev/pluggy
选择名称迫使你设计一个接口!
----------------------------------------------------------
真的吗?多么难以忍受。
只是将所有 hacks 钩接到 'x' 上,我真正的无政府主义者。
不过,祝你好运,区分对象吧!
安装(大致)
--------------------------
从 pypi
pip3 install hacks
从 Github
pip3 install git+https://github.com/t184256/hacks.git
从本地源
pip3 install -r requirements.txt
python3 setup.py install
更多
----
`hacks` 给一个
名为 `mutants` 的通用对象代理库。
查看它:https://github.com/t184256/mutants
许可证
-------
`hacks` 在 MIT 许可证的条款下分发;
参见 [LICENSE.txt](LICENSE.txt)。
项目详情
关闭
hacks-0.0.12.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | dee1bf71376ccf216346dbdc4f5d5c0f1e9a4093de22454069ad46a5bf9c75f7 |
|
MD5 | 9268fc7fe709373fc5efdb752e5af9f0 |
|
BLAKE2b-256 | 4aa09a1ec841b0507de8ce0431c7774b4f419031e9d8b4e772fbea9e44b65637 |