【问题标题】:Python - Proper way to call nested functions?Python - 调用嵌套函数的正确方法?
【发布时间】:2021-09-03 05:40:56
【问题描述】:

假设您有以下代码

def set_args():
    #Set Arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("-test", help = 'test')
    return parser

def run_code():
    def fileCommand():
        print("the file type is\n")
        os.system("file " + filename).read().strip()

def main():
    parser = set_args()
    args = parser.parse_args()
    

def main(): 调用fileCommand() 函数的最佳方法是什么?

我有以下代码当然不起作用:

def main():
    parser = set_args()
    args = parser.parse_args()
    
    #If -test, 
    if args.test:
        filename=args.test
        fileCommand()

所以如果你要运行 python test.py -test test.txt 它应该运行 file 命令来获取文件类型

我知道如果我继续搞砸,我会以某种方式得到它,但我通常会开始过度复杂的事情,所以以后会更难。那么调用嵌套函数的正确方法是什么?

提前致谢!

【问题讨论】:

  • 你不能;该函数仅绑定到run_code 内的局部变量,一旦run_code 返回并且变量超出范围,该函数就会消失。 (不要介意你从不调用run_code,这意味着函数根本没有定义。)你为什么首先在run_code 中定义它?
  • 正确的方法是从函数本身调用嵌套函数:fileCommand() 在其定义之后,在run_code() 的主体中。如果不需要,甚至不嵌套它。
  • 另外,os.system() 不返回命令的输出;它返回None。只需删除 readstrip 函数,因为 file 只会写入它从您的脚本继承的标准输出。
  • 是的,对不起,我最初有 s = os.popen 用于有效的文件命令,但我有一些命令需要 os.system 所以我切换它以获得更广泛的答案来合并 os.system 没有甚至先运行它。

标签: python function parameter-passing nested-function


【解决方案1】:

Python 内部函数(或嵌套函数)有很多用例,但在其中没有一个,通过嵌套函数从外部访问是一种选择。嵌套函数是为了访问父函数变量而创建的,从父函数外部调用它是违反原则的。

您可以从父函数调用该函数或将其设为装饰器:

从父级调用嵌套函数将是:

def run_code(filename):
    def fileCommand():
        print("the file type is\n")
        os.system("file " + filename).read().strip()
    fileCommand()

如果您更多地描述您的用例以及您想要运行这样的代码的原因,我可以提供有关如何实现代码的更多详细信息。

【讨论】:

  • 是的,我认为问题在于会有多个命令(文件、binwalk、字符串等),并且根据文件类型(exe、pdf、doc)它运行基于某些命令关闭该扩展名。因此,对于 exes,它将运行 binwalk,但不适用于 txt 文件,但如果有意义的话,file 命令将对两者都运行。我让代码在 run_code 之外工作,每个都有自己的功能,猜测我可能不得不恢复到那个
猜你喜欢
  • 2017-02-21
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多