Metadata-Version: 2.4
Name: pyChainable
Version: 0.1.3
Summary: A package for creating chainable method calls in Python
Author-email: mrwuliu <mr_wuliu@foxmail.com>
Project-URL: Homepage, https://github.com/mr-wuliu/PythonChainable
Project-URL: Issues, https://github.com/mr-wuliu/PythonChainable/issues
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# pyChainable

[![PyPI version](https://img.shields.io/pypi/v/pyChainable.svg)](https://pypi.org/project/pyChainable/)
[![Python versions](https://img.shields.io/pypi/pyversions/pyChainable.svg)](https://pypi.org/project/pyChainable/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![CI](https://github.com/mr-wuliu/PythonChainable/actions/workflows/test.yml/badge.svg)](https://github.com/mr-wuliu/PythonChainable/actions/workflows/test.yml)

[中文文档](https://github.com/mr-wuliu/PythonChainable/blob/main/README.md) | [English Documentation](https://github.com/mr-wuliu/PythonChainable/blob/main/README.en.md)

pyChainable 是一个 Python 包，允许您创建可链式调用的方法，同时保持对原始值的操作能力。

## 安装

```bash
pip install pyChainable
```

## 使用

### 方法链式调用

`@chainable` 装饰器允许您创建可链式调用的方法。

```python
from pychain import chainable

class MyClass:
    def __init__(self):
        self.value = 0

    @chainable
    def add(self, num):
        self.value += num
        return self.value

    @chainable
    def multiply(self, num):
        self.value *= num
        return self.value

obj = MyClass()
result = obj.add(1).add(2).multiply(3)
print(result)  # 9
```

### 函数链式调用

`@pipeline` 装饰器允许将多个函数链接在一起，以便在执行时按顺序调用它们。上一个函数的返回值将作为下一个函数的参数。

```python
from pychain import pipeline

class TestClass:
    @pipeline
    def add_one(self, x: int) -> int:
        return x + 1

    @pipeline
    def add_two(self, x: int) -> int:
        return x + 2

test = TestClass()
test.add_one(2).add_two().add_two().add_two().add_two().add_two()
print(test)  # 12
```

### 字符串操作

```python
from pychain import pipeline

class StrTest:
    @pipeline
    def add(self, s: str) -> str:
        return s + '.'

    @pipeline
    def sp(self, s: str) -> str:
        return s + ','

getString = StrTest()
res = getString.add("word").sp().add().sp().add()
print(res)            # word.,.,.,
print(res.split(',')) # ['word.', '.', '.,']
```

### 矩阵运算

`@pipeline` 可以结合 `dataclass` 使用，以实现矩阵运算的链式调用。

```python
from dataclasses import dataclass
from pychain import pipeline

@dataclass(slots=True)
class Matrix:
    a: float
    b: float
    c: float
    d: float

    @pipeline
    def rotate(self, x, y):
        return (self.a * x + self.b * y, self.c * x + self.d * y)

    @pipeline
    def scale(self, x, y, factor: float):
        return (x * factor, y * factor)

m = Matrix(0, 1, -1, 0)

res = m.rotate(2, 3).scale(factor=2)
# continue with other operations
res2 = res.scale(factor=0.5)
```

## License

[MIT](https://github.com/mr-wuliu/PythonChainable/blob/main/LICENSE)
