小编Bog*_*gey的帖子

类型提示:检查类型是否兼容

我使用类型注释来进行一些基本的类型检查和自动类型转换。

作为其中的一部分,我希望检查给定类型是否应可分配给数据类的某些字段,即该类型是否与我的数据类上的类型注释“兼容”。

是否有任何开箱即用的方法来检查给定类型是否可分配给其他类型?IE

from typing import Optional, Union, Annotated, Type

def is_assignable(from_what: Type, to_what: Type) -> bool:
  // .. how?

is_assignable(int, int) // should be true
is_assignable(int, Optional[int]) should be true
is_assignable(int, Annotated[Union[str, Optional[int]], "hello world"]) // should be true
is_assignable(float, Annotated[Union[str, Optional[int]], "hello world"]) // False. Can't assign float to Annotated[Union[str, Optional[int]], "hello world"])
Run Code Online (Sandbox Code Playgroud)

我可以尝试自己解开所有的typing.*逻辑,即解开Optional、Union、Annotated等等,但这感觉相当难看(而且不太可维护,如果在最近的python版本中添加了新的东西)。

python python-3.9

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

JS Regex:在单引号之间匹配字符串中的单词

我试图找出一个正则表达式,它产生单引号(')之间的任何字符串,如果该字符串包含给定的单词.

例如,假设我有以下文本,并且我希望匹配包含单词"test"的单引号之间的所有内容:

Some sample text,
'this is test a match' and
'this is not a match' but
'this is a match again because it contains the word test'.
This "is not a test match because its double quotes".
And this is not a test match either because this is not encapsulated in quotes.
Run Code Online (Sandbox Code Playgroud)

正则表达式需要返回两个匹配,即

"this is a test match"
"this is a match again because it contains the word test"
Run Code Online (Sandbox Code Playgroud)

我在这里有点失落.我试过text.match(/'(.*?)'/); 返回单引号之间的所有内容,然后对子字符串匹配进行函数检查.但奇怪的是,正则表达式似乎甚至没有返回单引号属性中的所有字符串.

非常感谢指针..谢谢!

javascript regex

4
推荐指数
2
解决办法
3878
查看次数

从32位数据类型中有效地丢弃2位

假设您有32位数据类型:

// The letters are just to identify the position of each bit later in the post
abcdefgh ijklmnop qrstuvwx yzABCDEF
Run Code Online (Sandbox Code Playgroud)

我正在记录在某些位置"丢弃"位的最有效方法,其中丢弃意味着"移除"给定位,并移动以下位以填充其位置.

示例:假设我想删除"a"和"q"位.然后结果应该看起来像:

bcdefghi jklmnopr stuvwxyz ABCDEF00
Run Code Online (Sandbox Code Playgroud)

要么

00bcdefg hijklmno prstuvwx yzABCDEF
Run Code Online (Sandbox Code Playgroud)

这两种结果都是可以接受的.

在我的具体情况下,我也可以施加以下约束:

  • 在我的情况下,下跌的位置是静态的; 即我将始终需要完全删除第1和第16位("a"和"q")
  • 要删除的位("a"和"q")始终为0
  • 最终填充数据的位(操作后向左或向右的"00")无关紧要 - 即,如果它们实际为0或1则无关紧要

目前我正在使用这样的方法(伪代码):

// called with number = abcdefgh ijklmnop qrstuvwx yzABCDEF
auto drop_bits_1_16(unsigned int number)
{
    number = number << 1; // number becomes: bcdefghi jklmnopq rstuvwxy zABCDEF0
    unsigned number1 = number & 0xFFFE0000;  // number1 comes: bcdefghi jklmnop0 00000000 00000000 …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm bit-manipulation

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

用于在给定时间找到所有人还活着的快速算法?

假设你有类似的东西

class Person {
  LocalDate bornOn;
  LocalDate diedOn;
}
Run Code Online (Sandbox Code Playgroud)

假设您有一堆“ Person”实例,可以按照自己喜欢的任何方式进行存储。

编写可以列出给定时间所有在世人员的有效功能的最佳方法是什么?

数据结构也应该是有效可变的,尤其是在添加新元素方面。

即在概念上像

List<Person> alive(List<Person> people, LocalDate date) {
  return people.stream().filter(x -> x.bornOn.compareTo(date) <= 0 && x.diedOn.compareTo(date) > 0).collect(Collectors.toList())
}
Run Code Online (Sandbox Code Playgroud)

才更有效率。

我的第一感觉就是拥有两个NavigableMaps

NavigableMap<LocalDate, Person> peopleSortedByBornOn;
NavigableMap<LocalDate, Person> peopleSortedByDiedOn;
Run Code Online (Sandbox Code Playgroud)

每个查询都可以使用给定日期的headMap()/ tailMap()进行查询,并且这些查询的交集将成为结果。

是否有任何更快或更方便的解决方案?甚至某种支持这种操作的广泛使用的Java集合/地图类型?

java algorithm

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

实体框架:使用已知的外键插入对象,但在DB中尚不存在

我正在使用Entity Framework并且想要在数据库中插入一个对象,该对象引用了DB中尚不存在的另一个对象(但外键已知).

简单的例子:假设我有两个表Books(由他们的ISBN标识)和Purchases.我希望能够插入购买,即使该书尚未在数据库中设置:

public class Book
{
    [Key]
    public virtual string ISBN { get; set; }

    protected virtual IEnumerable<Purchase> purchases { get; set; }

    public virtual string author { get; set; }
    public virtual string title { get; set; }
// .....
}

public class Purchase
{
    [Key]
    protected virtual int id { get; set; }

    public virtual Book book { get; set; }

    public virtual double price;
}
Run Code Online (Sandbox Code Playgroud)

从概念上讲,这很容易:Purchase表格将有一个外键,即书籍的ISBN.因此,在常规SQL中,我可以将ISBN插入此字段,稍后将该书添加到books表中.

在EF/C#中,我想不出一个简单的方法来做到这一点.本Purchase类引用Book …

c# entity-framework

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

DirectX/C++ 3D Engine编程:立即学习,还是等待DirectX 12?

我是一个相对好的程序员,但到目前为止,我主要关注的是使用C#进行应用程序开发.我几乎没有游戏开发和3D引擎的经验 - 我已经开始阅读3D引擎的一般工作方式,例如,有一本很棒的指南解释了如何在C#中开发一个非常简单的基于软件的3D引擎.非常有帮助,但这几乎总结了我对该主题的整体经验.此外,到目前为止,我还没有真正使用过C++(尽管我已经意识到与C#的基本概念差异,并且会考虑在该语言中至少达到"足够"的速度可管理).

所以无论如何,出于纯粹的个人兴趣,我想开发 - 或者更确切地说,学习如何开发 - 用于教育目的的简单的基于DirectX的3D图形引擎.我只是对图形部分感兴趣(没有声音/动画/游戏状态/网络或其他什么,只有非常基本的输入).渲染一些简单的几何,然后逐步学习如何使用更现代的着色技术扩展它将是好的.

我已经找到了一些很好的资源.但在我深入研究这个主题之前:我知道DirectX12即将到来,并且看到它在多大程度上改进了系统,我真的不确定是否会对API进行许多重大修改.或者换句话说:我担心我现在开始学习DirectX 11的东西,从现在起几个月内,从编程的角度来看,DirectX 12的工作方式会有很大的不同,这一切都是无用的.

我不确定这已经知道了多少,或者是否有开发者以前可以向更广泛的公众开放.但如果它可以告诉你:你们是否会建议我等待DX12,或者从v11开始,因为未来的开发将非常相似?

为了记录,我当然知道学习DX11在任何情况下都不会受到伤害.但我并不急于求成,如果我现在学到的一半在几个月内就会过时,我宁愿等到那时才能慢慢开始.

c++ directx 3d direct3d game-engine

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

SharpCompress&LZMA2 7z存档-提取特定文件的速度非常慢。为什么?备择方案?

我有一个使用LZMA2压缩(压缩级别:超)的7zip存档。该档案文件包含1,749个文件,最初的总大小为661mb。压缩文件的大小为39mb。

现在,我正在尝试使用C#从此存档中提取一个很小的文件(大约200kb)。

我从IArchive(工作速度相对较快)中获取了相应的IArchiveEntry,但是随后调用IArchiveEntry.WriteToFile(targetPath)大约需要33秒!同样,如果我改为写入内存流,时间也很长。(编辑:当我在压缩级别=正常的7z LZMA2存档上运行此文件时,它仍需要9秒钟)

当我在实际的7zip应用程序中打开相同的存档并从那里提取相同的文件时,它只需要2-3秒。我怀疑这是多核(7zip)与单核(可能是ShapCompress吗?),但是我没有注意到7zip解压缩期间的CPU使用率激增。.也许它太快了,以至于无法注意到。

有人知道SharpCompress这么慢的速度可能是什么问题吗?我可能会缺少某些设置或使用了错误的工厂(ArchiveFactory)吗?

如果不是-是否有任何C#库在解压缩该库时可能会更快?

作为参考,这是我如何使用SharpCompress提取的草图:

private void Extract()
    {
        using(var archive = GetArchive())
        {
          var entryPath = /* ... path to entry .. */
          var entry = TryGetEntry(archive, entryPath);
          entry.WriteToFile(some_target_path);
        }
    }


    private IArchive GetArchive()
    {
        string path = /* .. path to my .7z file */;
        return ArchiveFactory.Open(path);
    }

    private IArchiveEntry TryGetEntry(IArchive archive, string path)
    {
        path = path.Replace("\\", "/");

        foreach (var entry in archive.Entries)
        {
            if (!entry.IsDirectory)
            {
                if (entry.Key == path)
                    return entry;
            } …
Run Code Online (Sandbox Code Playgroud)

c# compression performance lzma sharpcompress

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

增长 Span&lt;T&gt;,假设底层数组有足够的容量

假设我们有一个指向数组的子范围的跨度。

假设初始底层数组有足够的容量,有没有办法增加这个跨度?(假设我们不能使用

例子:

int[] array = new int[]{4, 17, 0, 2, 3, 16, 1};
var span = new Span<int>(array);

var s1 = span.Slice(0, 1);
// Assume we can't use "array" directly here anymore, but only s1
var s2 = s1.Slice(0, 2); // bang! Argument of ouf range exception, even though array would have enough capacity
Run Code Online (Sandbox Code Playgroud)

c#

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

为什么使用 callvirt 在泛型类型的只读字段上调用方法

考虑以下:

interface ISomething
{
    void Call(string arg);
}

sealed class A : ISomething
{
    public void Call(string arg) => Console.WriteLine($"A, {arg}");
}

sealed class Caller<T> where T : ISomething
{
    private readonly T _something;
    public Caller(T something) => _something = something;
    public void Call() => _something.Call("test");
}

new Caller<A>(new A()).Call();
Run Code Online (Sandbox Code Playgroud)

对 Caller<A>.Call 的调用以及对 A.Call 的嵌套 tcall 都是通过 callvirt 指令进行的。

但为什么?这两种类型都是众所周知的。除非我误解了什么,否则这里不应该使用 call 而不是 callvirt 吗?

如果是这样 - 为什么不这样做?这仅仅是编译器未完成的优化,还是背后有任何特定原因?

c# cil intermediate-language

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