簡體   English   中英

為什么在使用 >>= 運算符時會出現語法錯誤?

[英]Why am I getting a syntax error when using the >>= operator?

注意:我正在導入parsec,它重載>>= (ie - __irshift()__ ) 運算符

以下 Python 代碼:

#! /usr/bin/env python

# irshift_debug.py

from parsec import *

def id(x):
    """Identity parser."""
    return string("").result(x)

testp = digit() >>= id

print(testp.parse("5"))

產量:

$ ./irshift_debug.py
  File "./irshift_debug.py", line 9
    testp = digit() >>= id
                    ^
SyntaxError: invalid syntax

但是,如果我將違規行更改為:

testp = digit().bind(id)

然后我得到:

$ ./irshift_debug.py
5

正如預期的那樣。

我認為>>=bind()的中綴等價物; 這是不正確的嗎?

因為>>=是一個語句,而不是一個表達式。 它不會評估可以分配給testp的結果。

也許你正在尋找這個?

testp = digit >> id

我既沒有使用 Parsec 也沒有使用 Haskell,所以我無法在這個庫的上下文中談論預期用途。 但是,我相信您在這里感到困惑的主要原因是增強賦值的工作方式與普通運算符不同,因此重新實現它們的工作方式也略有不同

所以你已經看到了這段代碼:

def __irshift__(self, other):
    '''Implements the `(>>=)` operator, means `bind`.'''
    return self.bind(other)

不是很明顯的是,因為這是覆蓋增強賦值,而不是運算符,所以返回值用於重新分配左側的原始項目。 換句話說,這段代碼:

a >>= b

(基本上)等同於:

a = a.bind(b)

在任何一種情況下,正如Alexander's answer中所說,生成的賦值實際上不是一個表達式,並且最終不返回任何值(甚至不返回None )。 賦值的右半部分必須是表達式; 它不能是另一個任務1 就像在 Python 中一樣,您不能執行以下操作:

a = b = c

所以你也不能這樣做:

a = b >>= c

...即使您重新實現了>>=


1唯一的部分例外是最近添加的賦值表達式,但它(故意)使用受限,在這里對您沒有幫助。

這是一個設計錯誤。

我已轉而使用>=作為bind()的運算符並棄用了>>= 新版本的 parsec.py 已上傳到 pypi。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM