这:
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