小编abe*_*bey的帖子

什么是C++ 11中提出的无限制联合?

我收集unrestricted unions了C++ 11中提出的功能之一.任何人都可以解释这背后的语义及其提供的优势吗?

c++ unions c++11

16
推荐指数
2
解决办法
1万
查看次数

Sphinx:如何交叉引用自定义指令生成的目标

我在交叉引用自定义指令生成的部分时遇到问题。

这是指令:

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)

python cross-reference docutils python-sphinx

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

Django Count和Sum批注相互干扰

在构建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)

python django django-queryset

6
推荐指数
3
解决办法
753
查看次数

Django 注释对另一个注释有副作用

我遇到了一个问题,即向查询集添加注释会更改以前注释的结果。

这是(简化的)设置:

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 django django-annotate

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

__repr__ 与集合类 Python 的最佳实践是什么?

我有一个自定义的 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 等)?我应该使用分号实现某种缩短方案吗?如果是这样,是否有一种好的/标准的方法来实现这一目标?或者我应该完全跳过列出集合的内容吗?

python repr

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