По какой-то причине моя функция возвращает "Нет"? Зачем? - PullRequest
0 голосов
/ 12 января 2019

Почему grepcut () возвращает None?

from termcolor import colored
from subprocess import *

def grepcut(inputRaw, grep, delimit, field):
    for line in inputRaw:
        if grep in line:
            output = line.split(delimit)[field]
            return output
        else:
            return None


def function():
    print(colored("[+] ", "green") + "Here we go!")
    inputRaw = Popen(["cat outputfile"], shell=True, stdout=PIPE, universal_newlines=True).communicate()[0].rstrip()
    var1 = grepcut(inputRaw, grep = 'grep this', field = 6, delimit = " ")
    var2 = grepcut(inputRaw, grep = 'grep this', field = 2, delimit = " ")
    print("\n")
    print(var1, var2)
    #if var1 or var2 is None:
    #   print(colored("[-] ", "red") + "Not found!!!")
    #else:
    #   print(var1, var2)

function()

Кстати, это содержимое inputRaw:

A B C D E F G
H I J grep это K L M N
O P Q R S T U

Вывод этого кода:
Нет Нет

1 Ответ

0 голосов
/ 12 января 2019

Ваш grepcut проверяет только первую строку: если она совпадает, возвращается output, в противном случае она немедленно возвращает None, не переходя к следующей итерации.

Возможно, вы хотите удалить эту ветку else и переместить return None после for.

def grepcut(inputRaw, grep, delimit, field):
    for line in inputRaw:
        if grep in line:
            output = line.split(delimit)[field]
            return output
    return None

Вы можете даже опустить return None, так как в Python любая функция, которая завершается без явного return, возвращает None, однако я бы оставил его, чтобы было ясно, что это не надзор, а функция Ожидается, что вернет None, если ничего не найдет.


Кроме того, вы звоните communicate() через Popen, поэтому вы получаете строку , а не файловый объект; следовательно, вы не можете выполнять итерации по ее строкам, как это - итерации по строке итерируют по ее символам.

Если inputRaw действительно строка, вы должны разделить ее на новые строки, например:

def grepcut(inputRaw, grep, delimit, field):
    for line in inputRaw.split('\n'):
        if grep in line:
            output = line.split(delimit)[field]
            return output
    return None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...