我正在编写一个脚本,我有一个函数,称之为f()
,需要一个命令行参数(需要打开的文件名)。但是,f()
不会直接在main函数中调用。
我想知道从sys.argv[1]
直接拨打f()
是否是错误的编码约定?如果我不这样做,我将不得不将其作为参数传递给最终调用f()
的所有函数。
答案 0 :(得分:6)
总是假设您的函数需要的参数在命令行中可用是一种不好的做法 - 如果以其他方式调用此代码该怎么办?
函数应声明其需要访问的数据的输入参数。
至少,将必要的参数传递到f()
而不是访问sys.argv
有助于使f()
更加可重复使用。
答案 1 :(得分:4)
从主例程以外的任何地方访问sys.argv
是不好的形式,因为它将该代码耦合到命令行,从而难以从其他Python脚本中使用。
答案 2 :(得分:3)
您应该将文件名传递给f()
。这样,如果您想稍后使用该函数(可能作为模块函数),则不必使用sys.argv
。
你总是可以为f()
创建一个包装器(如果你很懒或者想让'main'代码保持干净),那就像这样:
def wrapperf():
return f(sys.argv[1])
如果您希望远离导入模块的其他脚本,可以在wrapperf
内定义main()
。
答案 3 :(得分:1)
是的,从f。
访问sys.argv是不好的做法我建议将必要的参数传递给f。但是因为f不会被主要调用...也许使用全局变量?我通常会尽量避免使用它们,但在你的情况下......>。>
我想知道有关程序设置方式的更多信息会有所帮助。 :P
答案 4 :(得分:1)
如果存在,我建议从sys.argv [1]设置文件名一次,如果不存在则要求用户输入。然后将其存储为对象或全局变量的一部分。这样就可以防止在设置完毕后必须传递一个基本上是静态字符串的东西。
答案 5 :(得分:0)
你绝对不想在某些低级函数中解析sys.argv。为避免大量参数传递,您可以提供一个由main()
调用的辅助函数,它只是将文件名存储到静态变量中,以供f()
稍后使用。
答案 6 :(得分:0)
我通常会反对它,但python中的BaseHttpServer实际上使用sys.argv [1]来确定要侦听的端口。方便也许。