小编giu*_*tte的帖子

dir()用__getattr__执行什么样的python魔术?

以下是使用MySQLdb 1.2.3的python 2.7.

我需要一个类包装器来为不支持它的对象添加一些属性(带有__slots__和/或用C语言编写的类的类)所以我得到了类似这样的东西:

class Wrapper(object):

    def __init__(self, obj):
        self._wrapped_obj = obj

    def __getattr__(self, obj):
        return getattr(self._wrapped_obj, attr)
Run Code Online (Sandbox Code Playgroud)

我期待dir()在我的实例上调用的内置Wrapper函数应该只返回object plus继承的名称wrapped_obj,并且我发现大多数情况下都是这种情况,但并非所有情况都是如此.我尝试使用自定义旧样式类,自定义新样式类和一些内置类,它总是以这种方式工作:我发现的唯一例外是当包装对象是类的实例时_mysql.connection.在这种情况下,dir()我的对象碰巧也知道附加到包装的连接对象的所有方法名称.

我在python文档中读到了dir,这种行为似乎是合法的:dir应该返回一个"有趣的名字"列表,而不是实例的"真实"内容.但我真的无法弄清楚它是如何做到的:它实际上理解我的实现__getattr__并解析为附加项目?如果这是真的,为什么只有那个connection类而不是更简单dict

这里有一些粘贴的代码作为这种奇怪行为的一个例子:

>>> from _mysql import connection
>>> c = connection(**connection_parameters)
>>> c
<_mysql.connection open to '127.0.0.1' at a16920>
>>> 
>>> dir(c)
['affected_rows', 'autocommit', 'change_user', 'character_set_name', 'close', 'commit', 'dump_debug_info', 'errno', 'error', 'escape', 'escape_string', 'field_count', 'get_character_set_info', 'get_host_info', …
Run Code Online (Sandbox Code Playgroud)

python python-2.7

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

SQLAlchemy ORM 无法使用复合外键

我正在尝试使用几个相关模型构建一个示例,如下所示。我们有一个模型 B 与模型 C 具有 1:n 关系;那么我们就有一个模型 A,与 B 具有 1 关系,与 C 具有 1 关系。(C 有 2 列主键)

我尝试了这段代码:

class C(db.Model):
    __tablename__ = 'C'
    key1 = Column(Integer, primary_key=True)
    key2 = Column(Integer, primary_key=True)
    attr1 = Column(Date)
    attr2 = Column(Boolean)
    related_b = Column(Integer, ForeignKey('B.spam'))


class B(db.Model):
    __tablename__ = 'B'
    spam = Column(Integer, default=1, primary_key=True)
    eggs = Column(String, default='eggs')
    null = Column(String)
    n_relation = relationship(C, foreign_keys='C.related_b')


class A(db.Model):
    __tablename__ = 'A'
    foo = Column(String, default='foo', primary_key=True)
    bar = Column(String, default='bar', primary_key=True)
    baz …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy foreign-keys relationship

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

无限列表,懒惰的评估和长度

Haskell noob在这里:我仍然试图理解语言的机制,所以如果我的问题很简单,请原谅我并指出一些我可以学习的链接(我在stackoverflow上搜索了类似主题的一段时间) ,但我仍然无法得到这个).

我出来了这个功能:

chunks :: Int -> [a] -> [[a]]
chunks n xs
    | length xs <= n = [xs]
    | otherwise = let (ch, rest) = splitAt n xs in ch:chunks n rest
Run Code Online (Sandbox Code Playgroud)

以便

ghci> chunks 4 "abracadabra"
["abra","cada","bra"]
ghci> 
ghci> chunks 3 [1..6]
[[1,2,3],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)

我对此感到非常满意,然后我认为"有懒惰的评价!我甚至可以在无限序列中使用它!".所以我试过了take 4 $ chunks 3 [1..].我希望懒惰的haskell魔法会产生[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],相反,似乎这次懒惰无法帮助我:它无法达到计算的结束(它是否一路走到最后[1..]?)

我认为问题出在"长度xs"部分:ghci似乎也陷入了一个简单的问题length [1..].所以我问:长度实际上是在迭代整个列表以给出响应吗?如果是这样,我想每次我尝试使用懒惰评估实现一些正常工作时,应该避免长度,所以有一些替代方案吗?(例如,如何改进我的示例以使用无限列表?)

haskell infinite lazy-evaluation

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