繁体   English   中英

内联if语句的允许语法

[英]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

我们看到funcdefcompound_stmt 因此,在if条件下,如果我们必须定义一个函数,则def必须在此之前具有NEWLINEINDENT 这就是为什么您尝试的无效的原因。

但是这种好又简单的方法怎么样

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM