我收集unrestricted unions了C++ 11中提出的功能之一.任何人都可以解释这背后的语义及其提供的优势吗?
我在交叉引用自定义指令生成的部分时遇到问题。
这是指令:
from docutils import nodes
from docutils.parsers import rst
class TestDirective(rst.Directive):
has_content = False
required_arguments = 1
option_spec = {}
def run(self):
my_arg = self.arguments[0]
target_node = nodes.target('', '', refid=nodes.make_id(my_arg))
section = nodes.section(
'',
nodes.title(text=my_arg),
ids=[nodes.make_id(my_arg)],
names=[nodes.fully_normalize_name(my_arg)])
return [target_node, section]
def setup(app):
app.add_directive('mytest', TestDirective)
Run Code Online (Sandbox Code Playgroud)
这是它的使用方法:
=============
Test document
=============
.. mytest:: section1
Section 1 content.
.. _section2:
section2
========
Section 2 content.
Run Code Online (Sandbox Code Playgroud)
现在,以下仅适用于section2:
Here are links to :ref:`section1` and :ref:`section2`.
Run Code Online (Sandbox Code Playgroud)
该链接仅正确生成section2,我收到以下错误:
test.rst:19: WARNING: undefined label: …Run Code Online (Sandbox Code Playgroud) 在构建QuerySet带有多个批注的复合体时,我遇到了一个问题,该问题可以通过以下简单设置重现。
这些是模型:
class Player(models.Model):
name = models.CharField(max_length=200)
class Unit(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE,
related_name='unit_set')
rarity = models.IntegerField()
class Weapon(models.Model):
unit = models.ForeignKey(Unit, on_delete=models.CASCADE,
related_name='weapon_set')
Run Code Online (Sandbox Code Playgroud)
使用我的测试数据库,可以获得以下(正确)结果:
Player.objects.annotate(weapon_count=Count('unit_set__weapon_set'))
[{'id': 1, 'name': 'James', 'weapon_count': 23},
{'id': 2, 'name': 'Max', 'weapon_count': 41},
{'id': 3, 'name': 'Bob', 'weapon_count': 26}]
Player.objects.annotate(rarity_sum=Sum('unit_set__rarity'))
[{'id': 1, 'name': 'James', 'rarity_sum': 42},
{'id': 2, 'name': 'Max', 'rarity_sum': 89},
{'id': 3, 'name': 'Bob', 'rarity_sum': 67}]
Run Code Online (Sandbox Code Playgroud)
如果现在将两个批注合并到相同的QuerySet,我将获得不同的(不准确的)结果:
Player.objects.annotate(
weapon_count=Count('unit_set__weapon_set', distinct=True),
rarity_sum=Sum('unit_set__rarity'))
[{'id': 1, 'name': 'James', 'weapon_count': 23, 'rarity_sum': 99}, …Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,即向查询集添加注释会更改以前注释的结果。
这是(简化的)设置:
class Player(models.Model):
name = models.CharField()
class Unit(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE,
related_name='unit_set')
rarity = models.IntegerField()
class Gear(models.Model):
pass
class UnitGear(models.Model):
unit = models.ForeignKey(Unit, on_delete=models.CASCADE,
related_name='ug_set')
gear = models.ForeignKey(Gear, on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)
用稀有度 7 单位的数量来注释玩家效果很好:
Player.objects.annotate(
rarity7_count=Count(unit_set__rarity=7)
).values_list('name', 'rarity7_count')
[('Player1', 170),
('Player2', 172),
('Player3', 164),
...,
)]
Run Code Online (Sandbox Code Playgroud)
上面返回的值rarity7_count是正确的。
如果我添加以下附加注释,情况就不再是这样:
Player.objects.annotate(
rarity7_count=Count(unit_set__rarity=7),
gear_count=Count(unit_set__ug_set)
).values_list('name', 'rarity7_count', 'gear_count')
[('Player1', 476, 456),
('Player2', 490, 466),
('Player3', 422, 433),
...,
)]
Run Code Online (Sandbox Code Playgroud)
请注意值是如何rarity7_count变化的——这些值不再正确!gear_count然而,的值是正确的。
这是为什么?如何让两个注释同时工作而不互相干扰?我已经尝试过各种各样的事情,但目前不知道如何做到这一点。
我有一个自定义的 Python 类,它本质上封装了list某种对象,我想知道我应该如何实现它的__repr__功能。我很想采用以下方法:
class MyCollection:
def __init__(self, objects = []):
self._objects = []
self._objects.extend(objects)
def __repr__(self):
return f"MyCollection({self._objects})"
Run Code Online (Sandbox Code Playgroud)
这具有生成完整描述类实例的有效 Python 输出的优点。然而,在我的真实案例中,对象列表可能相当大,每个对象本身可能有一个很大的代表(它们本身就是数组)。
在这种情况下,最佳做法是什么?接受 repr 可能通常是一个很长的字符串吗?是否存在与此相关的潜在问题(调试器 UI 等)?我应该使用分号实现某种缩短方案吗?如果是这样,是否有一种好的/标准的方法来实现这一目标?或者我应该完全跳过列出集合的内容吗?