小编Mis*_*agi的帖子

__init__ 类中的 TypeVar 类型提示

我试图使用 TypeVar 来指示 init 参数为某种类型。但我做错了,或者根本不可能。

from typing import TypeVar

T=TypeVar("T")

class TestClass:
    def __init__(self,value:T):
        self._value=value

a = TestClass(value=10)
b = TestClass(value="abc")

reveal_type(a._value)
reveal_type(b._value)
Run Code Online (Sandbox Code Playgroud)

我希望揭露类型a._value会是int并且b._value一直是string。但它们都显示为“T`-1”

任何帮助或见解表示赞赏!

[编辑]

稍微扩展一点的例子。BaseClass 将被覆盖,实际类型提示由覆盖类提供。

from typing import TypeVar

T=TypeVar("T")

class BaseClass:
    def __init__(self,value):
        self._value = value

class Class1(BaseClass):
    def __init__(self,value:str):
        super().__init__(value)

class Class2(BaseClass):
    def __init__(self,value:int):
        super().__init__(value)

a = Class1("A value")
b = Class2(10)

reveal_type(a._value)
reveal_type(b._value)
Run Code Online (Sandbox Code Playgroud)

python python-typing

6
推荐指数
1
解决办法
4707
查看次数

什么时候可以在定义之前使用名称?

在 SLY 中有一个编写计算器的例子(从calc.py 这里复制):

from sly import Lexer

class CalcLexer(Lexer):
    tokens = { NAME, NUMBER }
    ignore = ' \t'
    literals = { '=', '+', '-', '*', '/', '(', ')' }

    # Tokens
    NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'

    @_(r'\d+')
    def NUMBER(self, t):
        t.value = int(t.value)
        return t

    @_(r'\n+')
    def newline(self, t):
        self.lineno += t.value.count('\n')

    def error(self, t):
        print("Illegal character '%s'" % t.value[0])
        self.index += 1
Run Code Online (Sandbox Code Playgroud)

看起来它被窃听了,因为NAMENUMBER在它们被定义之前就被使用了。但实际上,没有NameError,并且这段代码执行得很好。这是如何运作的?什么时候可以在定义之前引用名称?

python sly

6
推荐指数
1
解决办法
152
查看次数

更好的设计以避免违反里氏替换原则

我遇到了里氏替换原则的问题,并且不太确定解决它的最佳方法是什么。

有问题的代码

class BaseModel:
    def run(self, base_model_input: BaseModelInput) -> BaseModelOutput:
        """Throws NotImplemented or @abstractmethod"""
        pass

class SpecificModel(BaseModel):
    def run(self, specific_input: SpecificModelInput) -> SpecificModelOutput:
        # do things...
Run Code Online (Sandbox Code Playgroud)

我很清楚为什么这不是一个很好的代码,以及为什么它违反了里氏替换原则。我想知道如何更好地设计我的系统以避免这个问题。

从根本上讲,我有一个BaseModel类似于接口的类,提供一些run扩展类必须实现的方法。但是扩展类还处理特定的输入/输出,它们也是基本输入/输出类的扩展(继承SpecificModelInputBaseModelInput添加一些字段和功能,与输出相同)

这里更好的方法是什么?

python design-patterns liskov-substitution-principle python-3.x python-typing

6
推荐指数
1
解决办法
945
查看次数

apt-get install python3-venv 不起作用

我正在使用 chromebook,使用 Debian。我需要运行终端命令python -m venv env,但是当我使用它时,我收到错误

The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt-get install python3-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

Failing command: ['/home/jacob/env/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']
Run Code Online (Sandbox Code Playgroud)

所以我跑apt-get install python3-venv

但出现错误

E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: …
Run Code Online (Sandbox Code Playgroud)

python python-venv

6
推荐指数
1
解决办法
1万
查看次数

如何注释函数生成数据类?

dataclass假设你想像这样包装装饰器:

from dataclasses import dataclass

def something_else(klass):
    return klass

def my_dataclass(klass):
    return something_else(dataclass(klass))
Run Code Online (Sandbox Code Playgroud)

应该如何my_dataclass和/或something_else注释以指示返回类型是数据类?请参阅以下示例,了解内置函数如何@dataclass工作但自定义函数@my_dataclass则不然:


@dataclass
class TestA:
    a: int
    b: str

TestA(0, "") # fine


@my_dataclass
class TestB:
    a: int
    b: str

TestB(0, "") # error: Too many arguments for "TestB" (from mypy)
Run Code Online (Sandbox Code Playgroud)

python python-3.x mypy python-typing

6
推荐指数
1
解决办法
4431
查看次数

如何在 Python 中创建一个简单的标志

从雅虎获得 SPY 的数据后,我创建了一个收盘价通道,如下所示,最大和最小滚动窗口。色谱柱是 HC 和 HL。

我需要创建一个列(我称之为标志),当收盘价等于 HC 时显示 1,并且该值会持续到收盘价等于 HL。此时Flag的值为-1。如您所见,非常简单,Flag 可以只有两个值;1 或 -1。

简单的公式是这样的:

  1. 如果关闭 == HC 则标志为 1
  2. 如果关闭 == HL 则标志为 -1
  3. 如果 Close != HC 和 Close !=HL 则 flag 等于保存在变量 flag 上的最后一个值。

我尝试了几件事,包括下面的代码,但都没有成功。此代码的问题在于显示了 0 值。而且我不知道如何通过条件使其消失:

import pandas as pd
import pandas_datareader as dr
import numpy as np
from datetime import date

df = dr.data.get_data_yahoo('SPY',start='01-01-2019',end=date.today())

df['HC'] = df['Close'].rolling(20).max() 
df['LC'] = df['Close'].rolling(20).min() 

df['Flag'] = [1 if (df.loc[ei, 'Close'] == df.loc[ei, 'HC']) else 
              -1 if (df.loc[ei, 'Close'] == …
Run Code Online (Sandbox Code Playgroud)

python trading algorithmic-trading pandas

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

asyncio 任务已被销毁但正在挂起

我正在编写一个示例程序,它从数据源(csv 或 rdbms)中读取数据块,进行一些转换并通过套接字将其发送到服务器。

但因为 csv 非常大,出于测试目的,我想在几个块之后中断读取。不幸的是,出了问题,我不知道是什么以及如何解决它。也许我必须取消一些活动,但现在确定在哪里以及如何取消。我收到以下错误:

Task was destroyed but it is pending!
task: <Task pending coro=<<async_generator_athrow without __name__>()>>
Run Code Online (Sandbox Code Playgroud)

示例代码是:

import asyncio
import json

async def readChunks():
  # this is basically a dummy alternative for reading csv in chunks
  df = [{"chunk_" + str(x) : [r for r in range(10)]} for x in range(10)]
  for chunk in df:
    await asyncio.sleep(0.001)
    yield chunk

async def send(row):
    j = json.dumps(row)
    print(f"to be sent: {j}")
    await asyncio.sleep(0.001)


async def main():
    i = 0 …
Run Code Online (Sandbox Code Playgroud)

python asynchronous event-loop coroutine python-asyncio

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

具有通用键和 Callable[T] 值的 Python 字典

我有一些命名元组:

JOIN = NamedTuple("JOIN", [])
EXIT = NamedTuple("EXIT", [])
Run Code Online (Sandbox Code Playgroud)

我还有处理每种类型元组的函数:

def handleJoin(t: JOIN) -> bool:
    pass

def handleExit(t: EXIT) -> bool:
    pass
Run Code Online (Sandbox Code Playgroud)

我想做的是创建一个字典,handleTuple这样我就可以这样称呼它:

t: Union[JOIN, EXIT] = #an instance of JOIN or EXIT
result: bool
result = handleTuple[type(t)](t)
Run Code Online (Sandbox Code Playgroud)

我不知道如何定义所述字典。我尝试定义一个泛型T

T = TypeVar("T", JOIN, EXIT)
handleTuple: Dict[T, Callable[[T], bool]
Run Code Online (Sandbox Code Playgroud)

但是我收到一条错误消息“类型变量 T 未绑定”,我不明白。到目前为止我得到的最接近的是:

handleTuple: Dict[Type[Union[JOIN, EXIT]], bool]
handleTuple = {
    JOIN: True
    EXIT: False
}
Run Code Online (Sandbox Code Playgroud)

这可以很好地按照我想要的方式调用它,但是我无法弄清楚Callable定义中的部分,因此我可以包含我的函数。我怎样才能做到这一点

python generics python-3.x mypy

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

python 使用默认参数输入抽象方法

我有点困惑我应该如何输入基类抽象方法?

在这种情况下,我的基类只要求继承类实现一个名为“learn”的方法,该方法返回 None 而不强制任何参数。

class MyBaseClass(ABC):
    @abstractmethod
    def learn(self, *args, **kwargs) -> None:
       raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)

但如果我实现它 mypy 会引发错误““学习”签名与超类型“MyBaseClass”不兼容”

class MyOtherClass(MyBaseClass):
    def learn(self, alpha=0.0, beta=1) -> None:
       # do something
       return None
Run Code Online (Sandbox Code Playgroud)

那么我应该如何在基类中声明 learn 方法呢?

python python-3.x mypy

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

如何申请@enum.nonmember?

@enum.nonmember我试图为Python 3.11 中的新装饰器提出一个用例。文档明确提到它是一个应用于成员的装饰器。但是,当我尝试直接直接装饰成员时:

import enum


class MyClass(enum.Enum):
    A = 1
    B = 2

    @enum.nonmember
    C = 3
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

Traceback (most recent call last):
  File "C:\Program Files\Python311\Lib\code.py", line 63, in runsource
    code = self.compile(source, filename, symbol)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\codeop.py", line 153, in __call__
    return _maybe_compile(self.compiler, source, filename, symbol)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\codeop.py", line 73, in _maybe_compile
    return compiler(source, filename, symbol)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\codeop.py", line 118, in __call__
    codeob = compile(source, filename, symbol, self.flags, True)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<input>", line …
Run Code Online (Sandbox Code Playgroud)

python enums python-decorators python-3.11

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