小编Eli*_* Mi的帖子

类型为(self)的方法签名参数

当我定义一个类时,如何在其方法的签名中包含必须属于同一类的参数?我正在构建一个应该像这样工作的图形结构,但这里是一个简化的示例:

class Dummy:
    def __init__(self, value: int, previous: Dummy=None):
        self._value = value
        self._previous = previous

    @property
    def value(self):
        return self._value

    def plus_previous(self):
        return self.value + self._previous.value

d1 = Dummy(7)
d2 = Dummy(3, d1)
d2.plus_previous()
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

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

我的意思是,我可以用 Python 2 的方式来做,但我希望有一个比这更多的 python-3-ic 解决方案:

class Dummy:
    def __init__(self, value: int, previous=None):
        assert type(previous) is Dummy or previous is None
        ...
Run Code Online (Sandbox Code Playgroud)

python oop methods method-signature python-3.x

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

使用 SQLAlchemy 刷新物化视图

我有以下设置:

Postgres

在 Postgres (Aurora) 中,我设置了一个物化视图。由于仅允许视图的所有者刷新它,因此我还创建了以下函数以允许其他用户刷新它:

CREATE OR REPLACE FUNCTION refresh_views()
    RETURNS void
    SECURITY DEFINER
AS
$$
BEGIN
    REFRESH MATERIALIZED VIEW my_schema.my_view with data;
    RETURN;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

当我转到 SQL 终端并运行以下行时,视图将按预期刷新:

SELECT refresh_views();
Run Code Online (Sandbox Code Playgroud)

Python

我们将 Python 与 SQLAlchemy/Pandas 结合使用,并且在大多数情况下运行得非常好。但是,我似乎无法从 Python 中使其正常工作。下面的两个版本都运行没有问题,并且花费的时间大致相同(约 1 分钟),但此后视图不会更新。

cxn.execute(text("SELECT refresh_views();"))
pd.read_sql(text("SELECT refresh_views();"), cxn)
Run Code Online (Sandbox Code Playgroud)

知道为什么这不起作用吗?

python sql postgresql sqlalchemy

3
推荐指数
1
解决办法
3364
查看次数