функциональные шаблоны фильтрации для os.walk() с цепочкой функций

Мне нужно включить/исключить некоторые файлы во время os.walk() в Питоне.

Моему решению разрешено быть императивным, но пользователь моего кода должен иметь возможность выполнять < href="https://en.wikipedia.org/wiki/Declarative_programming" rel="nofollow noreferrer">декларативное программирование.

Шаблоны включения/исключения должны быть представлены в нейтральном для языка представлении (например, json).

Есть идеи, как это решить?


person guettli    schedule 01.06.2017    source источник
comment
То, как сформулирован ваш вопрос, предполагает, что вы пытаетесь заставить нас сделать вашу домашнюю работу за вас. что ты уже испробовал?   -  person bdesham    schedule 06.06.2017
comment
Я не могу проголосовать за закрытие этого вопроса, так как есть открытая награда, но это слишком широко. По сути, вы просите Stack Overflow разработать формат данных и создать для вас рабочую реализацию.   -  person bdesham    schedule 06.06.2017


Ответы (1)


Это и императивное, и декларативное.

find ./some_dir | grep -e '*.txt' | grep -v 'dont_keep.txt'

вот пример json, который является как императивным, так и декларативным:

bullets = {"include": ['hello'], "exclude": ['*.txt', '*.jpeg']}
weapon = filter(bullets)
walkers = os.walk('.')
[weapon(zombie) for zombie in walkers]

вот пример, который является и тем и другим, и намного сложнее, чем нужно:

from functools import wraps
def zombie_killer(f):
    @wraps(f)
    def moral_code(**kwargs):
        w = kwargs.get('weapon', '')
        f = kwargs.get('friendlies', '')
        z = kwargs.get('zombies', '')
        def maps(walkers):
            for (hilltop, houses, zombies) in walkers:
                for creature in zombies:
                    if creature in f:
                        yield f
                    elif creature in zombie:
                        yield
        return maps
    return moral_code

@zombie_killer
def kill_directive(*args, **kwargs):
    ''' magic goes here '''
    print(args, kwargs)


watch = kill_directive(weapon=bullets, 
                       friendlies=['rick', 'morty'], 
                       zombies=['*.txt', '*.pid'])
list(watch(walkers))

Очень хороший пример этого можно увидеть здесь:

person jmunsch    schedule 07.06.2017
comment
Я думаю, что сегодня слишком поздно. Интерпретатор Python в моем мозгу думает, что это выглядит хорошо, но не смог его выполнить. Другими словами. Я не понимаю, зачем нужны декораторы. Я стараюсь их избегать, так как я не гений программирования. - person guettli; 08.06.2017
comment
@guettli, вы можете писать декларативные / функциональные фрагменты кода и обертывать их, чтобы создать вещь, которая может перебирать вещи, а затем отфильтровывать их. - person jmunsch; 08.06.2017