相关疑难解决方法(0)

从类定义中的列表推导中访问类变量

如何从类定义中的列表推导中访问其他类变量?以下适用于Python 2但在Python 3中失败:

class Foo:
    x = 5
    y = [x for i in range(1)]
Run Code Online (Sandbox Code Playgroud)

Python 3.2给出了错误:

NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

尝试Foo.x也不起作用.有关如何在Python 3中执行此操作的任何想法?

一个稍微复杂的激励示例:

from collections import namedtuple
class StateDatabase:
    State = namedtuple('State', ['name', 'capital'])
    db = [State(*args) for args in [
        ['Alabama', 'Montgomery'],
        ['Alaska', 'Juneau'],
        # ...
    ]]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,apply()本来是一个不错的解决方法,但它遗憾地从Python 3中删除.

python scope list-comprehension python-3.x python-internals

152
推荐指数
3
解决办法
2万
查看次数

不能在子的初始化程序中的列表推导中调用父方法,但显式循环有效

child类从继承parent类.child我在构造函数内部 通过重复调用中定义的成员函数初始化一个list-type成员变量.事实证明,如果我通过显式循环并附加返回的每个值进行初始化,一切正常.xsfoo()parentxsfoo()

但是,如果我尝试在列表理解中做同样的事情,我会收到一个奇怪的错误.为什么会出现此错误?在这种情况下,列表理解和显式循环之间有什么区别?

有效的代码的MWE:

class parent(object):
    def __init__(self):
        self.x = 5

    def foo(self, a):
        return self.x


class child(parent):
    def __init__(self):
        super().__init__()

        self.xs = []
        for i in range(9):
            self.xs.append(super().foo(i))    

mychild = child()
Run Code Online (Sandbox Code Playgroud)

child列表理解的定义:

class child(parent):
    def __init__(self):
        super().__init__()
        self.xs = [super().foo(i) for i in range(9)]
Run Code Online (Sandbox Code Playgroud)

有问题的错误:

% python test.py
Traceback (most recent call last):
  File "test.py", line 20, in <module>
    mychild = child()
  File "test.py", line …
Run Code Online (Sandbox Code Playgroud)

python inheritance python-3.x

8
推荐指数
1
解决办法
454
查看次数

具有列表推导的类变量的范围

看看下面这段代码:

class a:
    s = 'python'
    b = ['p', 'y']
    c = [x for x in s]
Run Code Online (Sandbox Code Playgroud)

输出:

>>> a.c
['p', 'y', 't', 'h', 'o', 'n']
Run Code Online (Sandbox Code Playgroud)

但当我试图限制列表时,如果:

class a:
    s = 'python'
    b = ['p', 'y']
    c = [x for x in s if x in b]
Run Code Online (Sandbox Code Playgroud)

显示以下异常:

Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    class a:
  File "<pyshell#22>", line 4, in a
    c = [x for x in s if x in b]
  File "<pyshell#22>", …
Run Code Online (Sandbox Code Playgroud)

python scope list-comprehension

5
推荐指数
1
解决办法
1265
查看次数