0

string模块导入时,与解析函数一起使用。

from string import punctuation


def parsing_func(data):
    if not any(i==v for i in data for v in punctuation.replace('_', '')):
        print data

在上面的这个函数中使用string' punctuation,一切正常。

然后我想对照几个较少的标点符号检查数据。所以我改成parsing_func这样:

def parsing_func(data):
    punctuation = punctuation.replace('_', '')
    punctuation = punctuation.replace('()', '')
    if not any(i==v for i in data for v in punctuation):
        print data

但这会返回:

Traceback (most recent call last):
  File "parser.py", line 58, in <module>
    parsing_func(data)
  File "ex.py", line 8, in parsing_func
    punctuation = punctuation.replace('_', '')
UnboundLocalError: local variable 'punctuation' referenced before assignment

所以,我做了一个测试功能来检查punctuation

def test_func1():
    print type(punctuation), punctuation

>>> <type 'str'> !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

打印出来很好,没有错误,并显示type str. 最后,我尝试将print一个接一个的字符串操作放在一起。

def test_func2():
    print type(punctuation), punctuation
    punctuation = punctuation.replace('_', '') 

但现在该print语句返回错误:

Traceback (most recent call last):
  File "parser.py", line 9, in <module>
    test_func2()
  File "parser.py", line 5, in test_func2
    print type(punctuation), punctuation
UnboundLocalError: local variable 'punctuation' referenced before assignment

这是一个namespace错误吗?为什么test_func2在打印而不是字符串操作时会返回错误?

4

3 回答 3

1

您在第二个函数中同时具有本地punctuation和全局punctuation。您可以重命名它:

def parsing_func(data):
    punct = punctuation.replace('_', '')
    punct = punctuation.replace('()', '')

    if not any(i == v for i in data for v in punct):
        print data

或者punctuation明确地制作一个全局:

def parsing_func(data):
    global punctuation

    punctuation = punctuation.replace('_', '')
    punctuation = punctuation.replace('()', '')

    if not any(i==v for i in data for v in punctuation):
        print data

请注意,这会punctuation全局修改,所以我不会这样做。

您也可以使用集合来执行此操作:

def has_punctuation(data):
    punct = set(punctuation) - set('_()')

    return punct & set(data)  # Intersection of the two sets
于 2013-04-20T20:21:52.323 回答
1

您在punctuation函数内部赋值,因此 Python 将其视为局部变量:因此它根本不使用全局名称。为作业使用不同的名称。

于 2013-04-20T20:21:56.773 回答
1

这里的问题是您试图分配一个全局名称 - punctuation,这是 Python 不允许的,因此它创建了一个局部变量punctuation。此时,它会尝试punctuation在右侧查找,并获取尚不存在的局部变量。

为了解决这个问题,您可以使用global修改全局变量(这是一个坏主意,可能不是您想要的),或者只是将其分配给本地名称。

def parsing_func(data):
    less_punctuation = punctuation.replace('_', '')
    less_punctuation = less_punctuation.replace('()', '')
    if not any(i in less_punctuation for i in data):
        print data

还值得注意的是我使用in来检查成员资格 - 它更具可读性和更快。一般来说,成员资格测试在集合上更快,并且通过使用集合,我们还可以以更易读的方式删除值:

def parsing_func(data):
    less_punctuation = set(punctuation) - set("_()")
    if not any(i in less_punctuation for i in data):
        print data
于 2013-04-20T20:21:58.137 回答