小编Mic*_*ert的帖子

在运行时验证 Python TypedDict

我正在 Python 3.8+ Django/Rest-Framework 环境中工作,在新代码中强制执行类型,但建立在许多无类型的遗留代码和数据之上。我们广泛使用 TypedDicts 来确保我们生成的数据以正确的数据类型传递到 TypeScript 前端。

MyPy/PyCharm/等。在检查我们的新代码是否输出符合要求的数据方面做得很好,但我们想测试我们的许多 RestSerializers/ModelSerializers 的输出是否符合 TypeDict。如果我有一个序列化器并输入如下字典:

class PersonSerializer(ModelSerializer):
    class Meta:
        model = Person
        fields = ['first', 'last']

class PersonData(TypedDict):
    first: str
    last: str
    email: str
Run Code Online (Sandbox Code Playgroud)

然后运行如下代码:

person_dict: PersonData = PersonSerializer(Person.objects.first()).data
Run Code Online (Sandbox Code Playgroud)

静态类型检查器无法发现person_dict缺少所需email密钥,因为(根据 PEP-589 的设计)它只是一个普通的dict. 但我可以写这样的东西:

annotations = PersonData.__annotations__
for k in annotations:
    assert k in person_dict  # or something more complex.
    assert isinstance(person_dict[k], annotations[k])
Run Code Online (Sandbox Code Playgroud)

它会发现email序列化器的数据丢失了。在这种情况下,这很好,我没有引入任何更改from __future__ import annotations(不确定这是否会破坏它),并且我的所有类型注释都是裸类型。但如果PersonData定义如下:

class PersonData(TypedDict):
    email: Optional[str] …
Run Code Online (Sandbox Code Playgroud)

django-rest-framework mypy python-typing typeddict

21
推荐指数
2
解决办法
9429
查看次数

在WPF中创建吉他和弦编辑器(来自RichTextBox?)

我正在WPF工作的主要目的是允许编辑并因此在其上打印带有吉他和弦的歌曲歌词.

即使你不玩任何乐器,你可能已经看过和弦.为了给你一个想法,它看起来像这样:

E                 E6
I know I stand in line until you
E                  E6               F#m            B F#m B
think you have the time to spend an evening with me
Run Code Online (Sandbox Code Playgroud)

但是我不想使用这种丑陋的单行间距字体,而是希望Times New Roman字体与歌词和和弦(粗体字的和弦)进行字距调整.我希望用户能够编辑它.

这似乎不是支持的方案RichTextBox.这些是我不知道如何解决的一些问题:

  • 和弦的位置固定在歌词文本中的某些字符上(或更常见的TextPointer是歌词行).当用户编辑歌词时,我希望和弦保持在正确的角色上.例:

.

E                                       E6
I know !!!SOME TEXT REPLACED HERE!!! in line until you
Run Code Online (Sandbox Code Playgroud)
  • 换行:2行(带和弦的第1行和带歌词的第2行)在包装时逻辑上是一行.当一个单词换行到下一行时,它上面的所有和弦也应该换行.此外,当和弦包裹它已经结束的词时,它也会包裹.例:

.

E                  E6
think you have the time to spend an
F#m            B F#m B
evening with me
Run Code Online (Sandbox Code Playgroud)
  • 即使和弦彼此太近,和弦也应保持正确的特征.在这种情况下,一些额外的空间会自动插入歌词行中.例:

.

                  F#m E6
  ...you have the ti …
Run Code Online (Sandbox Code Playgroud)

.net wpf user-interface richtextbox music-notation

19
推荐指数
2
解决办法
2089
查看次数

将LilyPond源文件自动转换为多个键的最佳方法是什么?

问题

我正在使用LilyPond为教堂合唱团排版乐谱.根据任何给定周的人数,歌曲将以各种键播放.我们有一位出色的钢琴演奏家可以演奏我们扔在她身上的任何东西,吉他手通常会以交替的和弦方式画笔,但我希望通过在我们想要的任何键上提供精美排版的乐谱来让事情变得更轻松.

所以说我们要唱我们的ABC.首先,我将采用任何可用的源代码转换并将其输入LilyPond脚本:

melody = \relative c' {
    c c g g
    a a g2
    f f e e
    d d c2 }
Run Code Online (Sandbox Code Playgroud)

我希望能够自动转置它,所以如果我想要'G'中的整个内容我将这首歌包装在\ transpose调用中,如下所示:

melody = \transpose c g \relative c' {
    c c g g
    a a g2
    f f e e
    d d c2 }
Run Code Online (Sandbox Code Playgroud)

我真正想要的是用'g'替换某些东西并多次为旋律生成输出.简单的LilyPond变量似乎在这里不起作用,到目前为止,我在定义一个方案函数时没有成功.

我暂时使用的是获取上述文件,将其称为twinkle.ly并将其转换为名为twinkle.ly.m4的M4脚本,其内容如下所示:

melody = \transpose c _key \relative c' {
c c g g
a a g2
f f e e
d d c2 }
Run Code Online (Sandbox Code Playgroud)

然后我通过执行以下行来编译while事物:

> m4 -D _key=g …
Run Code Online (Sandbox Code Playgroud)

scheme typesetting m4 lilypond music-notation

15
推荐指数
1
解决办法
6953
查看次数

函数可以知道它们是否已经在Python中进行了多处理(joblib)

我有一个使用多处理(特别是joblib)的功能来加速使用多个核心的慢速例程.它很棒; 没有问题.

我有一个使用多处理的测试套件(目前只是multiprocessing.Pool()系统,但可以将其更改为joblib)以独立运行每个模块的测试功能.它很棒; 没有问题.

问题是我现在已经将多处理功能集成到模块的测试套件中,以便池进程运行多处理功能.我想这样做,以便内部函数知道它已经被多处理并且不会自行调整更多的分支.目前内部进程有时会挂起,但即使它没有,显然在已经并行的例程中没有多处理的好处.

我可以想到几种方法(使用锁定文件,设置某种全局变量等)来确定我们所处的状态,但我想知道是否有一些标准方法可以解决这个问题(在PY多处理中)或在joblib).如果它只适用于PY3,那就没问题,但显然在2.7或更低的情况下工作的解决方案会更好.谢谢!

python joblib python-multiprocessing

15
推荐指数
1
解决办法
315
查看次数

指定模型中Django字段的类型(用于Pylint)

我已经创建了基于CharField的自定义Django模型域子类,但是它使用to_python来确保返回的模型对象具有更复杂的对象(有些是列表,有些是具有特定格式的字典,等等)-我正在使用MySQL因此某些PostGreSql字段类型不可用。

一切都很好,但是Pylint相信这些字段中的所有值都是字符串,因此在使用这些模型的代码上我收到很多“ unsupported-membership-test”和“ unsubscriptable-object”警告。我可以单独禁用它们,但我想让Pylint知道这些模型返回某些对象类型。类型提示无济于事,例如:

class MealPrefs(models.Model):
    user = ...foreign key...
    prefs: dict = custom_fields.DictOfListsExtendsCharField(
            default={'breakfast': ['cereal', 'toast'], 'lunch': []},
            )
Run Code Online (Sandbox Code Playgroud)

我知道某些内置的Django字段会为Pylint返回正确的类型(CharField,IntegerField),某些其他扩展已经找到了指定其类型的方法,因此Pylint很高兴(MultiSelectField),但深入研究其代码,我不知道指定返回类型的“魔术”所在的位置。

(注意:此问题与Django表单字段的INPUT:type不相关)

谢谢!

django pylint django-models python-3.x python-typing

9
推荐指数
1
解决办法
268
查看次数

根据听音习惯自动评分音乐

我在Delphi中创建了一个类似Winamp的音乐播放器.当然不是那么复杂.只是一个简单的.

但现在我想添加一个更复杂的功能:图书馆中的歌曲应根据用户的收听习惯自动评分.

这意味着:应用程序应该"理解"用户是否喜欢某首歌.不仅是他/她喜欢它还是喜欢它多少.

到目前为止我的方法(可以使用的数据):

  • 只需测量每次播放歌曲的频率.将歌曲添加到库中时开始计算时间,以便最近的歌曲没有任何缺点.
  • 测量歌曲平均播放的时间长度(分钟).
  • 由于用户似乎不喜欢这首歌,因此开始播放歌曲但直接改为另一首歌应该对排名产生不良影响.
  • ...

你能帮帮我解决这个问题吗?我想提出一些想法.我不需要在Delphi中实现.

automation artificial-intelligence recommendation-engine rating audio-player

8
推荐指数
2
解决办法
747
查看次数

从头开始的WAV文件合成 - C.

最近我在CS 101课堂上看到了一个视频讲座,它启发我开始使用C语言中的WAV文件格式.我今天的项目一直是使用简单的数学正弦函数创建声音.尽管存在一些障碍,我的程序现在可以接受几个输入(波的频率,波的幅度,采样率等)并创建包含指定音高的wav文件.

但是,在我的计算机扬声器上播放这些音调时,会发出一种奇怪的,有节奏的砰砰声,这种声音随采样率而变化.在较高的采样率下,弹出声音的频率增加并变成恼人的呜呜声.

奇怪的是,弹出声音在具有相同文件的不同计算机上是一致的.

下面我将发布用于生成WAV文件的代码.任何可能导致这种现象的见解都将受到赞赏.这可能只是我某处的一个愚蠢的错误.:)

#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>

struct WAVHeader {
    char ChunkID[4];
    uint32_t ChunkSize;
    char RIFFType[4];
};

struct FormatHeader {
    char ChunkID[4];
    uint32_t ChunkSize;
    uint16_t CompressionCode;
    uint16_t Channels;
    uint32_t SampleRate;
    uint32_t AvgBytesPerSec;
    uint16_t BlockAlign;
    uint16_t SigBitsPerSamp;
};

struct DataHeader {
    char ChunkID[4];
    uint32_t ChunkSize;

};


void main(int argc, char * argv[]) {

//Check for valid number of arguments or display help
if(argc < 8) {
    printf("Usage:\n./Tone -l [length] -s [frequency] …
Run Code Online (Sandbox Code Playgroud)

c math audio signal-processing pitch

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

默认安装,Python中的"可选"依赖项(setuptools)

是否有指定这应该是一个Python包可选依赖的方式被默认安装pip,但对于其安装不应该被认为是失败,如果不能安装它们?

我知道我可以指定install_requires使用可以轻松安装某些可选依赖项的操作系统的90%用户安装软件包,我也知道我可以指定extra_require用户可以声明他们想要完整安装来获取这些软件包功能,但我还没有找到一种方法来进行默认pip安装尝试安装软件包,但如果无法安装则不会抱怨.

(我想要更新setuptoolssetup.pyfor 的特定包被称为music2195%的工具可以在没有matplotlib,IPython,scipy,pygame,一些模糊的音频工具等的情况下运行但是如果这些包有额外的能力和速度安装了软件包,我宁愿让人们默认拥有这些功能,但如果无法安装则不报告错误)

python pip setuptools music21

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

Python C API:如何检查对象是否是类型的实例

我想检查一个对象是否是某个类的实例。在 Python 中,我可以使用isinstance(obj, cls). 在 C/C++ 中,我发现了一个名为PyObject_IsInstance的函数。但它似乎不起作用isinstance

详细(也称为下面的示例代码):

  1. 在 C++ 中,我定义了我的自定义类型My。类型定义为MyType,对象定义为MyObject
  2. 添加MyType到名为 name 的导出模块My
  3. 在 Python 中,创建一个新实例my = My(),并isinstance(my, My)返回True
  4. 而在C++中,我们使用PyObject_IsInstance(my, (PyObject*)&MyType)检查my,并且返回0,这意味着my不是由定义的类的实例MyType

完整的C++代码:

#define PY_SSIZE_T_CLEAN
#include <python3.6/Python.h>
#include <python3.6/structmember.h>
#include <stddef.h>

typedef struct {
    PyObject_HEAD
    int num;
} MyObject;

static PyTypeObject MyType = []{
    PyTypeObject ret = {
        PyVarObject_HEAD_INIT(NULL, …
Run Code Online (Sandbox Code Playgroud)

c++ python python-c-api

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

通过子类化改变 Python 的类型参数

Python 的类型系统允许在类中使用泛型:

class A(Generic[T]):
    def get_next(self) -> T
Run Code Online (Sandbox Code Playgroud)

这非常方便。然而,即使在 3.11 中使用 Self 类型,我也找不到T在不指定类名的情况下更改类型参数 (the ) 的方法。以下是 PEP 673 中的推荐用法: 自类型:https ://peps.python.org/pep-0673/a

class Container(Generic[T]):
    def foo(
        self: Container[T],
    ) -> Container[str]:
        # maybe implementing something like:
        return self.__class__([str(x) for x in self])
Run Code Online (Sandbox Code Playgroud)

问题是如果我想子类化容器:

class SuperContainer(Container[T]):
    def time_travel(self): ...
Run Code Online (Sandbox Code Playgroud)

然后,如果我有一个 SuperContainer 的实例并在其上调用 foo ,则输入将会错误,并认为它是一个 Container 而不是 SuperContainer。

sc = SuperContainer([1, 2, 3])
sc2 = sc.foo()
reveal_type(sc2)  # mypy: Container[str]
sc2.time_travel()  # typing error: only SuperContainers can time-travel
isinstance(sc2, SuperContainer) …
Run Code Online (Sandbox Code Playgroud)

python generics typing subclass mypy

7
推荐指数
1
解决办法
826
查看次数