由于某种原因,我的函数返回“ None”?为什么?

时间:2019-01-12 11:00:28

标签: python python-3.x function

为什么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 this K L M N
  O P Q R S T U

此代码的输出是:
无无

1 个答案:

答案 0 :(得分:5)

您的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,因此您将获得 string 而不是文件对象;因此,您不能像这样直接在其行上进行迭代-在字符串上对其字符进行迭代。

如果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