15

我正在阅读“Learn Python the Hard Way”,对第二行的“脚本”部分感到困惑。

from sys import argv
script, filename = argv

据我了解,第二行说:script并且filename包含argv。我尝试在没有“脚本”部分的情况下运行我的代码,它工作得很好。我不确定它的目的是什么。

4

4 回答 4

16

通常,命令行可执行文件的第一个参数是脚本名称,其余的是预期参数。

这里,argv是一个预计包含两个值的列表:脚本名称和参数。使用 Python 的解包表示法,您可以编写

script = argv[0]
filename = argv[1]

作为

script, filename = argv

同时如果有意外数量的参数(如一个或三个)也会抛出错误。这可能是一个好主意,具体取决于一个人的代码,因为它还确保没有意外的参数。

但是,以下代码不会导致filename实际包含文件名:

filename = argv

这是因为filename现在是参数列表。为了显示:

script, filename = argv
print("Script:", script)  # Prints script name
print("Filename:", filename)  # Prints the first argument

filename = argv
print("Filname:", filename)  # Prints something like ["my-script.py", "my-file.txt"]
于 2012-12-02T04:21:34.547 回答
5

其他人已经解释了什么是script,但python语句称为解包,通常应用于元组或序列。

这是为=符号右侧元组(或序列)中的每个值分配变量的快捷方式。

它不是特定于argv

>>> a,b = ('Hello','World')
>>> a
'Hello'
>>> b
'World'

要记住的一件事是左侧的变量数必须与右侧序列中的项目数匹配,否则您会得到:

>>> a,b,c = ('Hello','World')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack
>>> a,b = ('Hello','World','!')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
于 2012-12-02T04:22:20.557 回答
3

argv是程序的参数列表。标准 shell 行为包括程序本身的名称作为argv.

如果左侧变量的数量等于右侧列表的大小,Python 可以一次分配多个值(它也可以处理更多情况,但这是最基本的)。例如

script, filename = argv

是相同的

script = argv[0]
filename = argv[1]

另请注意,该脚本将引发一个ValueErrorifargv不完全有两个元素。

于 2012-12-02T04:26:27.577 回答
2

第一项argv是您正在运行的 Python 脚本的名称。任何其他参数(在本例中为文件名)都是传递给此脚本的参数。

这两个参数被分配了名称scriptfilename。完全有可能script永远不再使用;它基本上是一个占位符。但是,如果您将其删除,则可以这样做filename = argv[1]

于 2012-12-02T04:18:50.313 回答