我试图使用 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) 在 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)
看起来它被窃听了,因为NAME和NUMBER在它们被定义之前就被使用了。但实际上,没有NameError,并且这段代码执行得很好。这是如何运作的?什么时候可以在定义之前引用名称?
我遇到了里氏替换原则的问题,并且不太确定解决它的最佳方法是什么。
有问题的代码
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扩展类必须实现的方法。但是扩展类还处理特定的输入/输出,它们也是基本输入/输出类的扩展(继承SpecificModelInput并BaseModelInput添加一些字段和功能,与输出相同)
这里更好的方法是什么?
python design-patterns liskov-substitution-principle python-3.x python-typing
我正在使用 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) 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) 从雅虎获得 SPY 的数据后,我创建了一个收盘价通道,如下所示,最大和最小滚动窗口。色谱柱是 HC 和 HL。
我需要创建一个列(我称之为标志),当收盘价等于 HC 时显示 1,并且该值会持续到收盘价等于 HL。此时Flag的值为-1。如您所见,非常简单,Flag 可以只有两个值;1 或 -1。
简单的公式是这样的:
我尝试了几件事,包括下面的代码,但都没有成功。此代码的问题在于显示了 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) 我正在编写一个示例程序,它从数据源(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) 我有一些命名元组:
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定义中的部分,因此我可以包含我的函数。我怎样才能做到这一点
我有点困惑我应该如何输入基类抽象方法?
在这种情况下,我的基类只要求继承类实现一个名为“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 方法呢?
@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 ×10
python-3.x ×4
mypy ×3
asynchronous ×1
coroutine ×1
enums ×1
event-loop ×1
generics ×1
liskov-substitution-principle ×1
pandas ×1
python-3.11 ×1
python-venv ×1
sly ×1
trading ×1