测试 pygame.font.Font 的相等性
test equality for pygame.font.Font
我正在尝试制作这样的字体缓存:
from ._utils import SizedDict
def copysurf(x,mod):
if mod:
return cs(x)
return ImmutableSurface(x)
class FontCache:
def __init__(self):
self.cache = SizedDict(20)
self.fmisses = 0
self.fhits = 0
self.cmisses = {}
self.chits = {}
def getfor(self,font,char,aa,color):
if font not in self.cache:
self.cmisses[font] = 0
self.chits[font] = 0
self.cache[font] = SizedDict(300)
if char not in self.cache[font]:
self.cache[font][char] = font.render(char,aa,color)
return self.cache[font][char].copy()
fontCache = FontCache()
(sized dicts也是我做的,它们是删除最旧条目的dicts,如果它超出了构造函数中指定的容量。)
但是当我尝试缓存 font.You 看到的时候,问题出现了,
pygame.font.SysFont("Courier",22) == pygame.font.SysFont("Courier",22)
是假的,并且 hash() 函数返回了不同的 values.As 我知道,没有任何方法 returns 字体的原始名称,我们无法测试相等性仅通过知道大小以及粗体和斜体标志。
有什么想法吗?
您可以子类化 pygame.font.Font
,在创建字体时存储元数据。像这样:
import pygame
pygame.init()
class Font(pygame.font.Font):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.properties = (args, tuple(kwargs.items()))
def __hash__(self):
return hash(self.properties)
def __eq__(self, other):
return self.properties == other.properties
@classmethod
def construct(cls, fontpath, size, bold, italic):
font = cls(fontpath, size)
font.strong = bold
font.oblique = italic
return font
# Prints True
print(
pygame.font.SysFont("Courier", 22, constructor=Font.construct)
== pygame.font.SysFont("Courier", 22, constructor=Font.construct)
)
我正在尝试制作这样的字体缓存:
from ._utils import SizedDict
def copysurf(x,mod):
if mod:
return cs(x)
return ImmutableSurface(x)
class FontCache:
def __init__(self):
self.cache = SizedDict(20)
self.fmisses = 0
self.fhits = 0
self.cmisses = {}
self.chits = {}
def getfor(self,font,char,aa,color):
if font not in self.cache:
self.cmisses[font] = 0
self.chits[font] = 0
self.cache[font] = SizedDict(300)
if char not in self.cache[font]:
self.cache[font][char] = font.render(char,aa,color)
return self.cache[font][char].copy()
fontCache = FontCache()
(sized dicts也是我做的,它们是删除最旧条目的dicts,如果它超出了构造函数中指定的容量。)
但是当我尝试缓存 font.You 看到的时候,问题出现了,
pygame.font.SysFont("Courier",22) == pygame.font.SysFont("Courier",22)
是假的,并且 hash() 函数返回了不同的 values.As 我知道,没有任何方法 returns 字体的原始名称,我们无法测试相等性仅通过知道大小以及粗体和斜体标志。
有什么想法吗?
您可以子类化 pygame.font.Font
,在创建字体时存储元数据。像这样:
import pygame
pygame.init()
class Font(pygame.font.Font):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.properties = (args, tuple(kwargs.items()))
def __hash__(self):
return hash(self.properties)
def __eq__(self, other):
return self.properties == other.properties
@classmethod
def construct(cls, fontpath, size, bold, italic):
font = cls(fontpath, size)
font.strong = bold
font.oblique = italic
return font
# Prints True
print(
pygame.font.SysFont("Courier", 22, constructor=Font.construct)
== pygame.font.SysFont("Courier", 22, constructor=Font.construct)
)