В Python можно ли инкапсулировать точно синтаксис общего среза и передать его? Я знаю, что я могу использовать slice
или __slice__
для эмуляции среза. Но я хочу передать тот же синтаксис, что и в квадратных скобках, которые будут использоваться с __getitem__
.
Например, предположим, что я написал функцию для возврата некоторого фрагмента списка.
def get_important_values(some_list, some_condition, slice):
elems = filter(some_condition, some_list)
return elems[slice]
Это отлично работает, если я вручную передаю объект среза:
In [233]: get_important_values([1,2,3,4], lambda x: (x%2) == 0, slice(0, None))
Out[233]: [2, 4]
Но то, что я хочу передать пользователю, - это точно такая же нарезка, которую они использовали бы с помощью __getitem__
:
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:-1) )
# or
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:) )
Очевидно, это создает синтаксическую ошибку. Но есть ли способ сделать эту работу без написания собственного мини-парсера для срезов типа x:y:t
и принуждения пользователя передать их в виде строк?
Мотивация
Я мог бы просто сделать этот пример функцией, возвращающей что-то прямое, например, filter(some_condition, some_list)
, которое будет весь результат в виде списка. Однако в моем фактическом примере внутренняя функция намного сложнее, и если я знаю фрагмент, который пользователь хочет раньше времени, я могу значительно упростить вычисление. Но я хочу, чтобы пользователь не должен был делать много лишнего, чтобы рассказать мне фрагмент раньше времени.