繁体   English   中英

如何以 python 方式处理具有相同操作的不同输入类型?

[英]How to handle different input types with the same actions pythonically?

我写了一些代码,允许torch.Tensornp.ndarray数据类型。

这些函数将执行相同的操作,但由于它们是某些代码的不同 API,因此我需要始终执行isinstance检查才能执行操作。

一个例子:

import torch
import numpy as np
from typing import Union

torch_tensor = torch.tensor([1, 2, 3])
numpy_array = np.array([1, 2, 3])


def expand(inputs: Union[torch.Tensor, np.ndarray]) -> Union[torch.Tensor, np.ndarray]:
    if isinstance(inputs, torch.Tensor):
        return inputs.unsqueeze(0)
    elif isinstance(inputs, np.ndarray):
        return np.expand_dims(inputs, 0)
    else:
        raise TypeError("inputs must be either a torch.Tensor or a numpy.ndarray")

使用这种isinstance检查的一个或两个函数很好,但是当我添加更多具有与expand相同类型接口的函数时,它不是很“整洁”。 任何可以更优雅地处理这个问题的技巧或设计,这样我就不需要在每个 function 中执行isinstance检查。

扩展我的评论,而不是

from typing import Union
import random

def add_to_a(value: Union[int, str]) -> Union[int, str]:
    if isinstance(value, int):
        return value + 1
    elif isinstance(value, str):
        return str(int(value) + 1)

a = random.choice([0, "0"])

print(add_to_a(a))

我会将代码构造成类似这样的结构,其中当变量进入时,每种类型都有一个从顶层开始的单独管道。

import random

def add_to_int_a(value: int) -> int:
    return value + 1

def add_to_str_a(value: str) -> str:
    return str(int(value) + 1)

a = random.choice([0, "0"])

if isinstance(a, int):
    print(add_to_int_a(a))
    # Other int type processing
elif isinstance(a, str):
    print(add_to_str_a(a))
    # Other str type processing

如果处理管道中将有更多这些“联合”功能,则大多数情况下都是这种情况。 对于这里的一个联盟和那里的另一个联盟来说,这对个人来说并不重要。

如果我们在每个操作中都遵循第一个示例,这归结为DRY(不要重复自己)处理函数中的大量isinstance检查。

同样值得注意的是,构建类来帮助区分和分组功能可能是值得的,如果它有助于提高可读性的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM