小编Mis*_*agi的帖子

具有通用键和 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
查看次数

在单元测试中提取哈希种子

我需要获取python使用的随机哈希种子来复制失败的单元测试.

如果PYTHONHASHSEED设置为非零整数,sys.flags.hash_randomization则可靠地提供它:

$ export PYTHONHASHSEED=12345
$ python3 -c 'import sys, os;print(sys.flags.hash_randomization, os.environ.get("PYTHONHASHSEED"))'
12345 12345
Run Code Online (Sandbox Code Playgroud)

但是,如果哈希是随机的,它只是指出种子使用,而不是其中:

$ export PYTHONHASHSEED=random
$ python3 -c 'import sys, os;print(sys.flags.hash_randomization, os.environ.get("PYTHONHASHSEED"))'
1 random
Run Code Online (Sandbox Code Playgroud)

信息sys.hash_info从不包括取决于种子的数据.使用python3.4之后哈希函数,尝试从给定的哈希重构种子似乎也是不可行的.


上下文:在微调算法时,我们已经看到了依赖于set/dict迭代次序的heisenbug.复制它们需要测试种子,最糟糕的是所有4294967295,但即使我们平均约100次测试也很长.

我们一直考虑将PYTHONHASHSEED外部设置为随机但已知的值,但我们希望避免使用这个额外的层.

python hash unit-testing python-3.x

4
推荐指数
1
解决办法
724
查看次数

使用异常处理解释 generator.close()

我正在阅读 python 文档https://docs.python.org/3/reference/expressions.html about generator.close()

我对文档的翻译是:

##generator.close()

GeneratorExit在生成器函数暂停的位置引发 a 。

  1. 如果生成器函数然后优雅地退出:

1.1 已经关闭,
1.2 或引发GeneratorExit(通过不捕获异常),

close 返回给它的调用者。

  1. 如果生成器产生一个值,则 aRuntimeError被提高。

  2. 如果生成器引发任何其他异常,则会将其传播给调用者。

close() 如果由于异常或正常退出,生成器已经退出,则不执行任何操作。


我不明白该close()行为如何对应于文档。

>>> def echo(value=None):
...     print("Execution starts when 'next()' is called for the first time.")
...     try:
...         while True:
...             try:
...                 value = (yield value)
...             except Exception as e:
...                 value = e
...     finally:
...         print("Don't forget to clean up when 'close()' is called.")
... …
Run Code Online (Sandbox Code Playgroud)

python generator

4
推荐指数
1
解决办法
845
查看次数

python asyncio 无法同时运行两个无限函数

我一直在尝试同时运行两个功能,但一个功能似乎永远无法工作,除非我停止另一个功能。第一个函数每 30 秒发送一封电子邮件,而第二个函数每 5 秒打印一条简单的语句。组合起来,每 6 个“Hello Worlds”输出应发送一封电子邮件。

然而,我从来没有收到过电子邮件,除非将打印更改为提前停止,例如 10 秒后结束。我该怎么做才能让两者同时运行而不停止?

async def timer():
    end = time.time() + 30
    while True:
        if time.time() >= end:
            sendmail(name, filepath + "\\" + name, receiver)
            end = time.time() + 30

async def runs():
    while True:
        print("Hello World")
        time.sleep(5)


loop = asyncio.get_event_loop()
loop.create_task(runs())
loop.create_task(timer())
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)

asynchronous python-3.x python-asyncio

4
推荐指数
1
解决办法
1613
查看次数

导入错误:无法导入名称“Celery”

我正在尝试学习 Celery,我正在使用 Django 2.0 和 celery 5.0.2,我的操作系统是 Ubuntu。

这是我的结构我的项目结构是:

celery/
  manage.py
  celery/
    __init__.py
    cerely_app.py
    settings.py
    urls.py
    wsgi.py
  apps/
      main/ 
        __init__.py
        admin.py
        apps.py
        models.py
        task.py
        views.py
        test.py          

Run Code Online (Sandbox Code Playgroud)

我的 cerely_app 配置基于文档:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery.settings')

app = Celery('celery')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')
Run Code Online (Sandbox Code Playgroud)

还有我的init.py

from .celery_app import app as celery_app
__all__ = ('celery_app',)
Run Code Online (Sandbox Code Playgroud)

但是当我使用命令 python3 manage.py runserver 时 django 给出导入错误:

$python3 manage.py runserver
Traceback (most recent call last):
  File "manage.py", line 15, in …
Run Code Online (Sandbox Code Playgroud)

python django celery python-3.x

4
推荐指数
1
解决办法
7966
查看次数

如何使用 `type()` 内置函数传递类关键字参数?

class语句采用各种功能的关键字参数。例如,该__init_subclass__函数接收在类声明中传递的关键字参数:

class A(object):
  def __init_subclass__(cls, **kwargs):
    print(f'{kwargs=}')

class B(A, my_arg=5):
  pass
Run Code Online (Sandbox Code Playgroud)
kwargs={'my_arg': 5}
Run Code Online (Sandbox Code Playgroud)

但是,这样做会阻止动态类创建:该type函数似乎不采用class关键字参数。工厂函数可以,但__init_subclass__在工厂必须修改类时可能会发生冲突或类似。

我想type()在其 3 参数版本中使用内置函数来动态创建一个类。但是,似乎没有记录的方法来传递关键字参数(如my_arg前面的示例)。

推荐的做法是什么?

python

4
推荐指数
1
解决办法
77
查看次数

使用 asyncio 在 python 中每 n 秒运行一个函数

我有一个应用程序,它已经无限运行,异步事件循环永远运行,而且我需要每 10 秒运行一个特定的函数。

def do_something():
   pass

a = asyncio.get_event_loop()
a.run_forever()
Run Code Online (Sandbox Code Playgroud)

我想每 10 秒调用一次函数 do_something 。如何在不使用 while 循环替换 asynctio 事件循环的情况下实现这一目标?

编辑:我可以用下面的代码来实现这一点

def do_something():
   pass
while True:
   time.sleep(10)
   do_something()
Run Code Online (Sandbox Code Playgroud)

但我不想使用 while 循环在我的应用程序中无限运行,而是想使用 asyncio run_forever()。那么如何使用 asyncio 每 10 秒调用相同的函数呢?有没有类似的调度程序不会阻止我正在进行的工作?

python python-asyncio

4
推荐指数
1
解决办法
5147
查看次数

数组列表的成员资格:ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()错误问题

Q = [np.array([0, 1]), np.array([1, 2]), np.array([2, 3]), np.array([3, 4])]
for q in Q:
    print(q in Q)
Run Code Online (Sandbox Code Playgroud)

运行上面的代码,它在第一次迭代时给出结果“True”,而随后出现 ValueError。

真的

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我不知道为什么它在第二次迭代时开始出错。任何人都可以帮助我plz..

python valueerror

4
推荐指数
1
解决办法
5427
查看次数