所以我明白:The end of a logical line is represented by the token NEWLINE
这意味着Python语法的定义方式结束逻辑行的唯一方法是使用\n标记。在
物理行也一样(更确切地说是EOL,它是编写文件时使用的平台的EOL,但是通过Python转换为通用的\n)。在
一条逻辑线可以等价于一条或多条物理线,也可以不等价于一条或多条物理线,但通常是一条,如果编写干净的代码,大多数情况下是一条。在
从某种意义上说:foo = 'some_value' # 1 logical line = 1 physical
foo, bar, baz = 'their', 'corresponding', 'values' # 1 logical line = 1 physical
some_var, another_var = 10, 10; print(some_var, another_var); some_fn_call()
# the above is still still 1 logical line = 1 physical line
# because ; is not a terminator per se but a delimiter
# since Python doesn't use EBNF exactly but rather a modified form of BNF
# p.s one should never write code as the last line, it's just for educational purposes
我的问题是文档中的以下部分,而不是举例说明1逻辑如何等同于>;1物理的问题:Statements cannot cross logical line boundaries except where NEWLINE
is allowed by the syntax (e.g., between statements in compound
statements)
但这又意味着什么呢?我理解复合语句的列表,不管它们是:if,while,for,等等。它们都由一个或多个子句组成,每个子句依次由标题和一个套件。
套件由一个或多个语句组成,让我们举一个更具体的例子:
因此,根据语法(不包括elifs和else子句),if语句是这样的:
^{pr2}$
其中,该套件及其后续语句:suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
所以这意味着,如果你想选择(用“|”表示)你的套房可以是以下两种方式中的一种:在同一条线上:
缺点:不是pythonic,并且不能有另一个引入新块的复合语句(如func def、另一个if等)
建议:我猜是一行
示例:if 'truthy_string': foo, bar, baz = 1, 2, 3; print('whatever'); call_some_fn();引入新区块:
优点:所有,以及正确的方法
示例:if 'truthy_value':
first_stmt = 5
second_stmt = 10
a, b, c = 1, 2, 3
func_call()
result = inception(nested(calls(one_param), another_param), yet_another))
但我不知道怎么做Statements cannot cross logical line boundaries except where NEWLINE
is allowed by the syntax
我在上面看到的是一个套件,它是一个由if子句控制的代码块,套件由逻辑独立的行(语句)组成,其中每个逻辑行都是一条物理行(巧合)。我看不出一条逻辑线是如何跨越界限的(基本上只是结尾、极限的一个花哨的词,这就是新行),我看不出一个语句如何跨越这些界限并延伸到下一个语句中,或者我真的很困惑,把所有的事情都搞混了,但如果有人能解释一下。在
感谢您提前抽出时间。在