NameError:python中的genexpr中未定义全局名称



这:

import os
class A(object):
    os_sep = os.sep
    _silentSkipsStart = {u'a dir%s' % os_sep}
    def _refreshBasic(self,os_sep=os_sep, skips_start=tuple(
                x.replace(os_sep, u'') for x in _silentSkipsStart)):
        pass

失败:

Traceback (most recent call last):
  File "C:/Users/MrD/.PyCharm50/config/scratches/scratch", line 3, in <module>
    class A(object):
  File "C:/Users/MrD/.PyCharm50/config/scratches/scratch", line 9, in A
    x.replace(os_sep, u'') for x in _silentSkipsStart)):
  File "C:/Users/MrD/.PyCharm50/config/scratches/scratch", line 9, in <genexpr>
    x.replace(os_sep, u'') for x in _silentSkipsStart)):
NameError: global name 'os_sep' is not defined

我想,将os_sep = os.sep引入全局范围应该可以解决这个问题(从设计的角度来看,我可能应该这样做)——但这里我没有得到python范围规则:为什么os_sep在其他情况下可以解决,而在genexpr中却不能解决?

正如@PadraicCunningham在评论中链接的答案所解释的那样:

类块中定义的名称的范围仅限于类块;它不扩展到方法的代码块——这包括理解和生成器表达式,因为它们是使用函数范围实现的

这是针对python 3的-对于python 2,列表理解可以工作-但理解变量会泄漏到类范围中-所以这会泄漏x:

    def _refreshBasic(self,os_sep=os_sep, skips_start=tuple(
                [x.replace(os_sep, u'') for x in _silentSkipsStart])):
        pass

所以我选择了:

import os
os_sep = os.sep
class A(object):
    _silentSkipsStart = {u'a dir%s' % os_sep}
    def _refreshBasic(self,os_sep=os_sep, skips_start=tuple(
                x.replace(os_sep, u'') for x in _silentSkipsStart)):
        pass

最新更新