Как смешать нормальные и слайс-аргументы в Python - PullRequest
0 голосов
/ 02 июля 2018

У меня есть класс, и я хотел бы создать экземпляр из массива плюс фрагмент. Я хотел бы, чтобы синтаксис использовал синтаксис двоеточия, например, используемый. списки и массивы. Следующий пример - MNWE (минимальный нерабочий пример):

import numpy as np

class A():

    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data.__getitem__(index)

    @classmethod
    def fromArray(cls, array, index):
        return cls(array.__getitem__(index))

x = np.empty((4, 2, 2)) 
a = A(x)
print(a[:, 0, 0]) 

# Create from array, using slices:
my_slices = (slice(0, -1, 1), slice(0, 1, None), slice(0, 1, None))
b = A.fromArray(x, my_slices)
print(b.data)

# Create from array, using slice colon syntax (fails):
c = A.fromArray(x, :, 0, 0)
print(c.data)

Я бы хотел, чтобы результаты были такими же, за исключением плоских размеров.

1 Ответ

0 голосов
/ 02 июля 2018

Я не знаю, возможно ли то, что вы пытаетесь сделать.

А как насчет создания фабричного класса?

class AFactory:
    def __init__(self, x):
        self.x = x

    def __getitem__(self, index):
        return A.fromArray(self.x, index)

c = AFactory(x)[:, 0, 0]
print(c.data)

Или, если вы предпочитаете устанавливать срез перед массивом:

class AFactory:
    def __getitem__(cls, index):
        return lambda x: A.fromArray(x, index)

c = AFactory()[:, 0, 0](x)
print(c.data)
...