小编Vek*_*eky的帖子

初始化位域

当你写作

struct {
    unsigned a:3, b:2;
} x = {10, 11};
Run Code Online (Sandbox Code Playgroud)

x.b保证是3由ANSI C(C89)?我已阅读并重新阅读标准,但似乎无法找到确切的情况.

例如,"无法用结果无符号整数类型表示的结果以模数的形式减少,该数字大于可由结果无符号整数类型表示的最大值." 谈论计算,而不是初始化.而且,位字段实际上不是一种类型.

此外,(当谈到无符号t:4时)"包含[0,15]范围内的值",但这并不一定意味着初始化器必须以模16减少以映射到[0,15].

结构初始化真的是详细描述,但我似乎无法找到确切的行为.(当然编译器就是这样做的.而且IBM文档说"当你将一个超出范围的值分配给一个位字段时,保留低位模式并分配适当的位.",但是我想要要知道ANSI C是否标准化了.

c struct initialization ansi bit-fields

10
推荐指数
2
解决办法
7806
查看次数

预期的,或; 之前如果

我犯了一个愚蠢的错误(忘了分号,最近太多的Python),但是从gcc得到了一个有趣的错误信息:"expected','或';' 在"如果"之前.

我知道这些错误消息只为可能的源代码提供了"上限",但是我想知道C中是否有任何构造,使得"if"令牌真正位于','之后,而不是';'之后.

c gcc

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

字符串没有被dicts引用?

看看这个Python代码:

from gc import get_referrers as refs
x = 'x'
d = {x:x}
print(d in refs(x))
Run Code Online (Sandbox Code Playgroud)

它打印False.这本身就很奇怪,但是当你考虑以下因素时变得更加怪异:

  • 如果x是一个数字(int,float,complex,Fraction,Decimal)而不是字符串,它仍然会打印False.对于字节和bytearray也是如此.但是对于其他所有类型(如果用作键,可以使用,如tuple或frozenset,还有许多其他类型,如果仅用作值),则会打印True.

  • 如果d是包含x的任何其他容器(set,list,tuple ...),则输出True.只有dict,它打印False.此外,如果x是键或值,或者如上所述,两者都无关紧要.

我认为在Python中,每个对象都是一个引用(而不是Java,它有原始类型,或者Ruby,它是值类型小的int),但现在看起来str和int是有点原始的类型,没有被引用.但另一方面,为什么只有在说?

我也知道在CPython中缓存了从-5到256的整数(并且可以实现小字符串),因此不重新计算它们是有意义的,因为它们永远不会被删除,但这适用于任何整数(和长字符串)我试过,比那个范围大得多.

有谁知道这里发生了什么?

---更新---

Curiouser和curiouser ......似乎是datetime.{datetime,date,time}类具有相同的"未引用"行为.现在,我知道有件事,AnyStr和Number有一个共同点:他们的哈希值是随机的,每个会话的盐.但这没有任何意义,因为即使这些行为仅仅是词汇中的而不是键,也会观察到行为.价值观并没有散播.或者是他们?

python string dictionary cpython reference

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

SQLAlchemy复合类型

SQLAlchemy是否支持PostgreSQL的复合类型(http://www.postgresql.org/docs/devel/static/rowtypes.html)?我发现它有类似的东西(sqlalchemy.orm.composite),但据我所知,它对我的​​目的来说还不够好.

我想创建一个单独的类型,例如Amountvaluecurrency,然后能够重复引用它,并且可能多次从同一个类引用它:

class Transfer(base):
    __tablename__ = "transfer"
    source_amount = Column(Amount)
    target_amount = Column(Amount)
Run Code Online (Sandbox Code Playgroud)

我见过的所有例子(例如这一个)都要求我指定列的名称,这使得上述方法不可能(列名称会发生​​冲突).

此外,我宁愿每个Amount有一个列而不是两个(因为value没有真正的意义currency,我宁愿数据库负责永远不要分离或混合它们).似乎Postgres可以做到这一点,我只需要一种方法向SQLAlchemy解释我需要什么.我试过阅读http://docs.sqlalchemy.org/en/latest/core/custom_types.html,但它似乎专注于扩充现有类型,而不是创建新的复合材料(我不知道该放什么impl) .

也许我应该放弃SQLAlchemy并直接与psycopg2沟通?它有一个psycopg2.extras.register_composite功能,但是一旦我这样做,我仍然不知道如何说服SQLAlchemy识别注册.我可能不得不以某种方式将光标从psycopg2传递给SQLAlchemy,但我不知道该怎么做.

postgresql sqlalchemy psycopg2 composite-types

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

在Python中自定义不可变类型

假设我想要一个frozenset带有2个元素的自定义,迭代,散列,比较,并具有各种其他不错的操作作为冻结集,但打印方式不同.

>>> p = edge(5, 7)
>>> p == edge(7, 5)
True
>>> p
edge(5, 7)
Run Code Online (Sandbox Code Playgroud)

我可以继承,或者我可以委托,但在任何情况下我都得不到我想要的.

如果我从字面上继承,似乎没有办法可以写__init__,因为我的父母是不可变的.我可以写:

class edge:
    def __new__(cls, a, b):
        return frozenset({a, b})
Run Code Online (Sandbox Code Playgroud)

但后来我得到了一个合适的冷冻集,无法自定义它__repr__,这就是我想要做的.我不能super()以任何好的方式在这里工作.

如果我委托,我可以覆盖__getattr____getattribute__,但是当例如__iter__被寻求时,它们都没有真正起作用.我想这里的特殊方法太特别了.我目前唯一的解决方案是手动委派我能想到的每一种特殊方法,但肯定必须有更好的方法.有任何想法吗?

python delegation immutability

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

Python bug?懒惰对象具有隐藏状态

考虑一下(Python 3.3):

a=enumerate([2,3,5])
print(list(a))
print(list(a))
Run Code Online (Sandbox Code Playgroud)

你真的希望两个打印电话打印不同的东西吗?我也不.

如果用set/ tuple或替换列表,也会发生同样的事情dict.如果你enumeratemap或替换对象也会发生这种情况filter,但奇怪的是,如果你用它替换它range.

也许这是一个功能.但这是非常令人惊讶的,没有记录(至少我没有找到任何关于它的东西),而且不一致(范围的工作原理不同).你怎么看?

python enumerate lazy-evaluation

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

定点的 Python 十进制上下文

我想用小数点前 3 位和小数点后 2 位的数字进行计算(当然,2 和 3 是可配置的)。我认为通过示例来解释最容易:

0.01 和 999.99 是正数的下限和上限。当然,也有0.00,以及-999.99到-0.01的负数。每两个连续数字之间的距离为 0.01。

7.80 + 1.20 应该是 9.00,而 999.00 + 1.00 应该是 OverflowError。0.20 * 0.40 应该是 0.08,0.34 * 0.20 应该是 0.07(这可以设置一个标志来表明它是四舍五入的,但它不能引发任何异常)。0.34 * 0.01 应为 0.00(与前一个条件相同)。

实际上,我想要从 0 到 99999 的“整数”,只是在第三个数字后面写一个点,乘法时缩小 100 倍,除法时放大 100 倍。应该可以为此找到确切的上下文,对吗?

问题是,我找不到 Emin、Emax、clamp 和 prec 的正确设置来满足我的要求。例如,我尝试将 Emin 和 Emax 设置为 0,但这引发了太多 InvalidOperations。我唯一知道的是四舍五入应该是 ROUND_HALF_EVEN。:-)

python fixed-point decimal exponent

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

printf格式,用于两个无符号整数的差值

在纯ANSI C(C89)中,我有以下内容.

unsigned y=<smallnumber>,x=y+3;
printf("%<whatgoeshere>\n",x-y);
Run Code Online (Sandbox Code Playgroud)

%绝对肯定会打印后放入什么3?我可以在这里看到两者的参数%u(如果两个操作数都是无符号的结果)和%d(int在传递参数时将积分表达式转换为printf).

当然,两者都适用于任何合理的编译器,这正是我在这里问的原因.:-)我感觉只有一个是真正正确的标准(但即使这可能是错误的).

c printf ansi unsigned-integer

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