簡體   English   中英

NameError:全局名稱未在python的genexpr中定義

[英]NameError: global name is not defined in genexpr in python

這個:

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可以os_sep解決而在genexpr

正如@PadraicCunningham的評論中鏈接的答案所解釋的那樣:

在類塊中定義的名稱范圍僅限於該類塊。 它沒有擴展到方法的代碼塊–這包括理解和生成器表達式,因為它們是使用函數范圍實現的

那是針對python 3的-對於python 2 列表的理解是可行的 -但comprehension變量將泄漏到類范圍內-因此這將泄漏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

暫無
暫無

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

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