内联if语句的允许语法

时间:2013-11-16 10:01:24

标签: python syntax

有时我喜欢滥用python语法,特别是使用短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-colon之后可能没有冒号吗?这条规则在哪里指定?或许我打破了更普遍的规则?哪一个?

4 个答案:

答案 0 :(得分:2)

您可以在此处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_stmtif之一。因此,在def条件下,如果我们必须定义一个函数,NEWLINE必须在此之前有INDENTdef a(): return "a" if True else "b" 。这就是为什么你所尝试的无效。

但这又好又简单呢

{{1}}

答案 1 :(得分:2)

语法规则在此处定义:http://docs.python.org/2.7/reference/compound_stmts.html

请注意,虽然技术上合法,但同一行上的多个语句被视为不良风格(参见pep08)。

答案 2 :(得分:1)

它给你一个错误,因为它现在被语法所允许。以下只是语法的相关部分。

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的语法很漂亮,为什么要试着让它变丑,只是为了节省一些线条? :)

答案 3 :(得分:1)

一般情况下,您不能在内联而不是套件的语句中启动套件。

例如

if 1: 2

有效,但

if 1: if 2: 3

无效。

除非极其简单的情况,否则不要在同一行上使用代码。

目标是更易于阅读的代码,而不是更短的代码。