当你写作
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是否标准化了.
我犯了一个愚蠢的错误(忘了分号,最近太多的Python),但是从gcc得到了一个有趣的错误信息:"expected','或';' 在"如果"之前.
我知道这些错误消息只为可能的源代码提供了"上限",但是我想知道C中是否有任何构造,使得"if"令牌真正位于','之后,而不是';'之后.
看看这个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有一个共同点:他们的哈希值是随机的,每个会话的盐.但这没有任何意义,因为即使这些行为仅仅是词汇中的值而不是键,也会观察到行为.价值观并没有散播.或者是他们?
SQLAlchemy是否支持PostgreSQL的复合类型(http://www.postgresql.org/docs/devel/static/rowtypes.html)?我发现它有类似的东西(sqlalchemy.orm.composite),但据我所知,它对我的目的来说还不够好.
我想创建一个单独的类型,例如Amount有value和currency,然后能够重复引用它,并且可能多次从同一个类引用它:
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,但我不知道该怎么做.
假设我想要一个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 3.3):
a=enumerate([2,3,5])
print(list(a))
print(list(a))
Run Code Online (Sandbox Code Playgroud)
你真的希望两个打印电话打印不同的东西吗?我也不.
如果用set/ tuple或替换列表,也会发生同样的事情dict.如果你enumerate用map或替换对象也会发生这种情况filter,但奇怪的是,如果你用它替换它range.
也许这是一个功能.但这是非常令人惊讶的,没有记录(至少我没有找到任何关于它的东西),而且不一致(范围的工作原理不同).你怎么看?
我想用小数点前 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。:-)
在纯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).
当然,两者都适用于任何合理的编译器,这正是我在这里问的原因.:-)我感觉只有一个是真正正确的标准(但即使这可能是错误的).
python ×4
c ×3
ansi ×2
bit-fields ×1
cpython ×1
decimal ×1
delegation ×1
dictionary ×1
enumerate ×1
exponent ×1
fixed-point ×1
gcc ×1
immutability ×1
postgresql ×1
printf ×1
psycopg2 ×1
reference ×1
sqlalchemy ×1
string ×1
struct ×1