everything2everything.core 模块文档

模块概述

everything2everything.core 模块是 everything2everything 库的核心实现,提供了全面的类型转换兼容层,支持所有Python标准数据类型和第三方库类型之间的双向转换。

该模块的主要功能包括:

  • 支持所有Python标准数据类型之间的转换
  • 支持第三方库类型(如numpy、pandas、torch、tensorflow等)之间的互转
  • 提供与Python内置函数兼容的转换函数
  • 内置缓存机制,提升性能
  • 类型安全,提供明确的错误提示
  • 自动处理第三方库依赖检测

核心类

TypeConverter 类

TypeConverter 是库的核心类,提供了第三方库类型之间的互转功能,以及标准类型的转换方法。

类定义

class TypeConverter:
    """类型转换兼容层
    
    A comprehensive type conversion compatibility layer that supports bidirectional
    conversion between all standard Python data types and third-party library types.
    """

主要方法

convert(obj, target_type)
def convert(obj, target_type): """通用类型转换方法,支持第三方库类型之间的互转"""

通用类型转换方法,支持将任意类型转换为指定的目标类型。

参数 类型 描述
obj Any 要转换的对象
target_type str 目标类型,可以是以下字符串之一: 'numpy', 'cupy', 'scipy', 'pandas', 'torch', 'xarray', 'jax', 'tensorflow'
返回值: 转换后的对象
异常:
  • ValueError - 如果目标类型无效
  • TypeError - 如果无法转换输入对象
示例:
from everything2everything import TypeConverter
import numpy as np

# 将numpy数组转换为torch张量
arr = np.array([1, 2, 3])
tensor = TypeConverter.convert(arr, 'torch')
print(type(tensor))  # 输出: <class 'torch.Tensor'>

# 将torch张量转换为tensorflow张量
tensor = TypeConverter.convert(tensor, 'tensorflow')
print(type(tensor))  # 输出: <class 'tensorflow.Tensor'>
numpy_to_xarray(obj)
def numpy_to_xarray(obj): """将numpy数组转换为xarray DataArray"""

将numpy数组转换为xarray DataArray,自动生成维度和坐标。

参数 类型 描述
obj numpy.ndarray 要转换的numpy数组
返回值: xarray.DataArray - 转换后的xarray DataArray
异常:
  • TypeError - 如果输入不是numpy数组
xarray_to_numpy(obj)
def xarray_to_numpy(obj): """将xarray DataArray转换为numpy数组"""

将xarray DataArray或Dataset转换为numpy数组。

参数 类型 描述
obj xarray.DataArray 或 xarray.Dataset 要转换的xarray对象
返回值: numpy.ndarray - 转换后的numpy数组
异常:
  • TypeError - 如果输入不是xarray对象
  • ValueError - 如果输入是空的xarray Dataset
torch_to_numpy(obj)
def torch_to_numpy(obj): """将torch Tensor转换为numpy数组"""

将torch Tensor转换为numpy数组,必要时从计算图中分离。

参数 类型 描述
obj torch.Tensor 要转换的torch张量
返回值: numpy.ndarray - 转换后的numpy数组
异常:
  • TypeError - 如果输入不是torch张量
numpy_to_torch(obj)
def numpy_to_torch(obj): """将numpy数组转换为torch Tensor"""

将numpy数组转换为torch Tensor。

参数 类型 描述
obj numpy.ndarray 要转换的numpy数组
返回值: torch.Tensor - 转换后的torch张量
异常:
  • TypeError - 如果输入不是numpy数组
jax_to_numpy(obj)
def jax_to_numpy(obj): """将jax数组转换为numpy数组"""

将jax数组转换为numpy数组。

参数 类型 描述
obj jax.numpy.ndarray 要转换的jax数组
返回值: numpy.ndarray - 转换后的numpy数组
异常:
  • TypeError - 如果输入不是jax数组
numpy_to_jax(obj)
def numpy_to_jax(obj): """将numpy数组转换为jax数组"""

将numpy数组转换为jax数组。

参数 类型 描述
obj numpy.ndarray 要转换的numpy数组
返回值: jax.numpy.ndarray - 转换后的jax数组
异常:
  • TypeError - 如果输入不是numpy数组
tensorflow_to_numpy(obj)
def tensorflow_to_numpy(obj): """将tensorflow Tensor转换为numpy数组"""

将tensorflow Tensor转换为numpy数组。

参数 类型 描述
obj tensorflow.Tensor 要转换的tensorflow张量
返回值: numpy.ndarray - 转换后的numpy数组
异常:
  • TypeError - 如果输入不是tensorflow张量
numpy_to_tensorflow(obj)
def numpy_to_tensorflow(obj): """将numpy数组转换为tensorflow Tensor"""

将numpy数组转换为tensorflow Tensor。

参数 类型 描述
obj numpy.ndarray 要转换的numpy数组
返回值: tensorflow.Tensor - 转换后的tensorflow张量
异常:
  • TypeError - 如果输入不是numpy数组
pandas_to_numpy(obj)
def pandas_to_numpy(obj): """将pandas对象转换为numpy数组"""

将pandas DataFrame或Series转换为numpy数组。

参数 类型 描述
obj pandas.DataFrame 或 pandas.Series 要转换的pandas对象
返回值: numpy.ndarray - 转换后的numpy数组
异常:
  • TypeError - 如果输入不是pandas对象
numpy_to_pandas(obj)
def numpy_to_pandas(obj): """将numpy数组转换为pandas对象"""

将numpy数组转换为pandas Series或DataFrame。

参数 类型 描述
obj numpy.ndarray 要转换的numpy数组
返回值: pandas.Series 或 pandas.DataFrame - 转换后的pandas对象
异常:
  • TypeError - 如果输入不是numpy数组
  • ValueError - 如果输入数组维度大于2

标准类型转换方法

TypeConverter 类还提供了一系列标准类型的转换方法,这些方法都使用了 @conversion_cache 装饰器,以提升性能。

to_list(obj)
@staticmethod @conversion_cache def to_list(obj): """转换为list"""

将任意对象转换为列表。

to_str(obj)
@staticmethod @conversion_cache def to_str(obj): """转换为str"""

将任意对象转换为字符串。

to_int(obj)
@staticmethod @conversion_cache def to_int(obj): """转换为int"""

将任意对象转换为整数。

to_float(obj)
@staticmethod @conversion_cache def to_float(obj): """转换为float"""

将任意对象转换为浮点数。

to_dict(obj)
@staticmethod @conversion_cache def to_dict(obj): """转换为dict"""

将任意对象转换为字典。

to_set(obj)
@staticmethod @conversion_cache def to_set(obj): """转换为set"""

将任意对象转换为集合。

to_tuple(obj)
@staticmethod @conversion_cache def to_tuple(obj): """转换为tuple"""

将任意对象转换为元组。

转换函数

模块提供了一系列与Python内置函数兼容的转换函数,这些函数是对 TypeConverter 类方法的封装,使用更加方便。

e2e_list(obj=None)

def e2e_list(obj=None): """转换为list"""

将任意对象转换为列表,默认为空列表。

参数 类型 描述
obj Any, optional 要转换的对象,默认为None
返回值: list - 转换后的列表
示例:
from everything2everything import e2e_list

# 基本类型转换
e2e_list(123)  # 输出: [123]
e2e_list(None)  # 输出: []
e2e_list("hello")  # 输出: ['h', 'e', 'l', 'l', 'o']

# 容器类型转换
e2e_list({"a": 1, "b": 2})  # 输出: [("a", 1), ("b", 2)]

# 第三方库类型转换
import numpy as np
e2e_list(np.array([1, 2, 3]))  # 输出: [1, 2, 3]

e2e_str(obj="")

def e2e_str(obj=""): """转换为str"""

将任意对象转换为字符串,默认为空字符串。

参数 类型 描述
obj Any, optional 要转换的对象,默认为空字符串
返回值: str - 转换后的字符串

e2e_int(obj=0)

def e2e_int(obj=0): """转换为int"""

将任意对象转换为整数,默认为0。

参数 类型 描述
obj Any, optional 要转换的对象,默认为0
返回值: int - 转换后的整数

e2e_float(obj=0.0)

def e2e_float(obj=0.0): """转换为float"""

将任意对象转换为浮点数,默认为0.0。

参数 类型 描述
obj Any, optional 要转换的对象,默认为0.0
返回值: float - 转换后的浮点数

e2e_dict(obj=None)

def e2e_dict(obj=None): """转换为dict"""

将任意对象转换为字典,默认为空字典。

参数 类型 描述
obj Any, optional 要转换的对象,默认为None
返回值: dict - 转换后的字典

e2e_set(obj=None)

def e2e_set(obj=None): """转换为set"""

将任意对象转换为集合,默认为空集合。

参数 类型 描述
obj Any, optional 要转换的对象,默认为None
返回值: set - 转换后的集合

e2e_tuple(obj=())

def e2e_tuple(obj=()): """转换为tuple"""

将任意对象转换为元组,默认为空元组。

参数 类型 描述
obj Any, optional 要转换的对象,默认为空元组
返回值: tuple - 转换后的元组

辅助函数

conversion_cache(func)

def conversion_cache(func): """缓存转换结果的装饰器"""

缓存转换结果的装饰器,用于提升转换性能,避免重复转换。

参数 类型 描述
func callable 转换函数
返回值: callable - 装饰后的函数
注意: 装饰器使用了简单的字典缓存,并实现了缓存大小限制,当缓存超过1000条时,会清理一半的条目。

类型转换规则

标准类型转换

1. 转换为 list

  • list: 保持不变
  • None: []
  • str/bytes: 转换为字符/字节列表
  • dict: 转换为键值对元组列表
  • int/float/bool: 转换为单元素列表
  • tuple/set: 转换为列表
  • 其他: 尝试使用原始 list() 函数

2. 转换为 str

  • str: 保持不变
  • None: ""
  • bool: 转换为小写字符串 ("true"/"false")
  • int/float/list/tuple/dict/set: 使用原始 str() 函数
  • 其他: 尝试使用原始 str() 函数

3. 转换为 int

  • int: 保持不变
  • None: 0
  • bool: 转换为 1/0
  • float: 截断小数部分
  • str: 尝试转换为整数
  • 空容器: 0
  • 单元素容器: 转换容器内元素
  • 多元素容器: 抛出 TypeError
  • 其他: 尝试使用原始 int() 函数

4. 转换为 float

  • float: 保持不变
  • None: 0.0
  • bool: 转换为 1.0/0.0
  • int: 转换为浮点数
  • str: 尝试转换为浮点数
  • 空容器: 0.0
  • 单元素容器: 转换容器内元素
  • 多元素容器: 抛出 TypeError
  • 其他: 尝试使用原始 float() 函数

5. 转换为 dict

  • dict: 保持不变
  • None: {}
  • list/tuple: 尝试转换为字典,失败则转换为索引字典
  • str/int/float/bool/set: 转换为 {"value": 值}
  • 其他: 尝试使用原始 dict() 函数

6. 转换为 set

  • set: 保持不变
  • None: set()
  • str/bytes: 转换为字符/字节集合
  • int/float/bool: 转换为单元素集合
  • list/tuple/dict: 转换为集合
  • 其他: 尝试使用原始 set() 函数

7. 转换为 tuple

  • tuple: 保持不变
  • None: ()
  • str/bytes: 转换为字符/字节元组
  • int/float/bool: 转换为单元素元组
  • list/set/dict: 转换为元组
  • 其他: 尝试使用原始 tuple() 函数

第三方库类型转换

模块支持以下第三方库类型之间的互转:

注意: 模块会自动检测第三方库是否可用,当库不可用时会给出明确的错误提示,不会导致程序崩溃。

性能优化

缓存机制

模块使用了 conversion_cache 装饰器,对转换结果进行缓存,避免重复转换,提升性能。

直接转换路径

convert 方法中,实现了一些直接转换路径,避免不必要的中间转换,例如:

  • torch → cupy
  • cupy → torch
  • torch → tensorflow
  • tensorflow → torch
  • jax → torch
  • torch → jax
  • jax → tensorflow
  • tensorflow → jax
  • pandas → xarray
  • xarray → pandas

延迟导入

第三方库采用延迟导入的方式,只有在需要时才会导入,减少启动时间和内存占用。

使用示例

基本使用

from everything2everything import (
    e2e_list, e2e_str, e2e_int, e2e_float, e2e_dict, e2e_set, e2e_tuple
)

# 示例 1:基本类型转换
print(e2e_list(123))  # 输出: [123]
print(e2e_str(None))  # 输出: ""
print(e2e_int("123"))  # 输出: 123
print(e2e_float(True))  # 输出: 1.0

# 示例 2:容器类型转换
print(e2e_list({"a": 1, "b": 2}))  # 输出: [("a", 1), ("b", 2)]
print(e2e_dict([1, 2, 3]))  # 输出: {0: 1, 1: 2, 2: 3}
print(e2e_set("hello"))  # 输出: {'h', 'e', 'l', 'o'}

# 示例 3:双向转换
print(e2e_list(e2e_tuple([1, 2, 3])))  # 输出: [1, 2, 3]
print(e2e_dict(e2e_list({"a": 1, "b": 2})))  # 输出: {0: ("a", 1), 1: ("b", 2)}

第三方库类型转换

from everything2everything import TypeConverter
import numpy as np
import torch

# 示例 1:numpy 与 torch 互转
arr = np.array([1, 2, 3])
tensor = TypeConverter.numpy_to_torch(arr)
print(type(tensor))  # 输出: <class 'torch.Tensor'>

arr2 = TypeConverter.torch_to_numpy(tensor)
print(type(arr2))  # 输出: <class 'numpy.ndarray'>

# 示例 2:使用通用转换方法
result = TypeConverter.convert(arr, 'torch')  # 转换为torch张量
print(type(result))  # 输出: <class 'torch.Tensor'>

# 示例 3:numpy 与 pandas 互转
import pandas as pd
series = TypeConverter.numpy_to_pandas(arr)
print(type(series))  # 输出: <class 'pandas.Series'>

arr3 = TypeConverter.pandas_to_numpy(series)
print(type(arr3))  # 输出: <class 'numpy.ndarray'>

总结

everything2everything.core 模块是一个功能强大、设计优雅的类型转换兼容层,它解决了Python中类型转换的各种问题,特别是在处理第三方库类型时的复杂性。

主要优势包括:

这个模块为Python开发者提供了一个统一、简洁的类型转换接口,大大简化了代码编写,提高了开发效率。