以下是使用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) 我正在尝试使用几个相关模型构建一个示例,如下所示。我们有一个模型 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) 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..].所以我问:长度实际上是在迭代整个列表以给出响应吗?如果是这样,我想每次我尝试使用懒惰评估实现一些正常工作时,应该避免长度,所以有一些替代方案吗?(例如,如何改进我的示例以使用无限列表?)
python ×2
foreign-keys ×1
haskell ×1
infinite ×1
orm ×1
python-2.7 ×1
relationship ×1
sqlalchemy ×1