Python, добавление разрыва в функцию или процесс только один раз - PullRequest
0 голосов
/ 18 октября 2018

У меня есть текстовые файлы с расширением .java, .c и .cpp.script.py работает, но как добавить разрыв в функцию?Если скрипт обрабатывает test1.txt, я бы хотел, чтобы он перешел к action1 и action2 только один раз для этого конкретного файла.

test.txt

abc/sas/.java

test1.txt

abc/sas/.java
abc/asfa/.java
def/def/.c
e/e/.cpp
e/fa/.cpp

script.py

PWD1 = PWD + "/folder"
set = ""
files = glob.glob(PWD1 + '/' + '*.txt')
def action1():
    print("ACTION1")

def action2():
    print("ACTION2")

strings = {'.java': action1, '.c' or '.cpp': action2}
for f in files:
    with open(f, 'r') as file:
        for line in sorted(file):
            print(line)
            for search, action in strings.items():
                if search in line:
                    action()

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Вам необходимо следить за выполняемыми действиями, чтобы вы выполняли только действие 1 один раз и действие 2 один раз, а затем выходили из строя.

Если я правильно понимаю, приведенный ниже код должен работать.

for f in files:
    a1 = False
    a2 = False
    with open(f, 'r') as file:
        for line in sorted(file):
            if a1 is False and '.java' in line:
                action1()
                a1 = True
            elif a2 is False and ('.cpp' in line or '.c' in line):
                action2()
                a2 = True
            if a1 and a2:
                break
0 голосов
/ 18 октября 2018

Две вещи:

Во-первых, чтобы ответить на ваш вопрос, вы можете сделать следующее:

ext_to_actions = {'java': action1, 'c': action2, 'cpp': action2}
for f in files:
    performed_actions = set()
    with open(f, 'r') as file:
        for line in sorted(file):
            print(line)
            file_ext = line.split('.')[-1]
            if file_ext in ext_to_actions:
                action = ext_to_actions[file_ext]
                if action not in performed_actions:
                    action()
                    performed_actions.add(action)

То, что это делает, снимает возможность выполнения действия более одного разаотслеживая выполненные действия в set и удерживая вас от повторяющихся действий.

Во-вторых, ваш словарь не будет вести себя так, как вы ожидаете.

>>> strings = {'.java': action1, '.c' or '.cpp': action2}
>>> strings
{'.java': action1, '.c': action2}

Это потому, что когда высоздавая словарь strings, вы фактически запрашиваете у Python программный выбор между '.c' or '.cpp'.Посмотрите следующий фрагмент кода, чтобы увидеть, как python интерпретирует это:

>>> '.c' or '.cpp'
'.c'

Вам нужно следующее ...

strings = {'.java': action1, '.cpp': action2, '.c': action2}
0 голосов
/ 18 октября 2018

Развернуть внутренний цикл и добавить оператор break в самом конце?Или используйте флаги.Remove "or '.cpp'", or не должно использоваться в подобных словарях.в основном '.c' or '.cpp' оценивается как ".c", но плохой стиль.Возможно, вы имели в виду «заканчивается», а не в?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...