[英]Allowed syntax for in-line if statements
有时我喜欢滥用python语法,特别是使用short if
块:
if True : print 'Hello'
else : print 'Bye'
现在,我尝试对函数定义执行相同的操作:
if True : def a(): return 'a'
else : def a(): return 'b'
print a()
但令人惊讶的是,我无法做到这一点:
File "xxx.py", line 1
if True : def a(): return 'a'
^
SyntaxError: invalid syntax
以下版本(等效于我,但不等同于python)很好:
if True :
def a(): return 'a'
else :
def a(): return 'b'
print a()
为什么? 我可以在if
语句中内联什么似乎有一个规则。 如果在冒号后面加上了冒号,可能会不允许? 该规则在哪里指定? 还是我违反了更一般的规则? 哪一个?
您可以在此处查看if
的语法http://docs.python.org/2/reference/compound_stmts.html#if
根据语法, if
允许
"if" expression ":" suite
suite
定义为
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
stmt_list
定义为
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
statement
定义为
stmt_list NEWLINE | compound_stmt
compound_stmt
定义为
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| decorated
我们看到funcdef
是compound_stmt
。 因此,在if
条件下,如果我们必须定义一个函数,则def
必须在此之前具有NEWLINE
和INDENT
。 这就是为什么您尝试的无效的原因。
但是这种好又简单的方法怎么样
def a():
return "a" if True else "b"
语法规则在此处定义: http : //docs.python.org/2.7/reference/compound_stmts.html
请注意,尽管从技术上讲是合法的,但同一行上的多个语句被认为是错误的样式(请参阅pep08)。
它给您一个错误,因为它现在已被语法允许。 以下仅是语法的相关部分。
if_stmt ::= "if" expression ":" suite
suite ::= stmt_list NEWLINE
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
simple_stmt ::= expression_stmt
| assert_stmt
| assignment_stmt
| augmented_assignment_stmt
| pass_stmt
| del_stmt
| print_stmt
| return_stmt
| yield_stmt
| raise_stmt
| break_stmt
| continue_stmt
| import_stmt
| global_stmt
| exec_stmt
如果从上面的定义中看到,则没有“ funcdef ”,其定义如下:
funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite
Python的语法很漂亮,为什么要使其丑陋,以节省一些行呢? :)
通常,内联而不是套件中的语句不能以套件开头。
例如
if 1: 2
是有效的,但是
if 1: if 2: 3
无效。
只是除非极端简单的情况,否则不要在同一行上使用代码。
目的是使代码易于阅读,而不是短于编写。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.