本文有一个片段__bases__
,通过向类继承的类的现有类集合添加一个类来动态更改某些Python代码的继承层次结构.好的,这很难读,代码可能更清晰:
class Friendly:
def hello(self):
print 'Hello'
class Person: pass
p = Person()
Person.__bases__ = (Friendly,)
p.hello() # prints "Hello"
Run Code Online (Sandbox Code Playgroud)
也就是说,Person
不从Friendly
源级别继承,而是通过修改__bases__
Person类的属性在运行时动态添加此继承关系.但是,如果您更改Friendly
并Person
成为新的样式类(通过继承自object),则会收到以下错误:
TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Run Code Online (Sandbox Code Playgroud)
关于这一点的谷歌搜索似乎表明,在运行时更改继承层次结构时,新样式类和旧样式类之间存在一些不兼容性.具体来说:"新式类对象不支持赋予其基础属性".
我的问题是,是否有可能通过使用__mro__
属性使上述Friendly/Person示例在Python 2.7+中使用新式类工作?
免责声明:我完全意识到这是一个模糊的代码.我完全意识到,在实际的生产代码中,这样的技巧往往难以理解,这纯粹是一个思想实验,并且可以让人们了解Python如何处理与多重继承相关的问题.
将一个功能移植到我的程序的Python 3.1分支时,我遇到了一个奇怪的错误.我将其缩小到以下假设:
与Python 2.x相比,在Python 3.x中,如果一个对象有一个__eq__
方法,它就会自动消失.
这是真的?
以下是Python 3.1中发生的情况:
>>> class O(object):
... def __eq__(self, other):
... return 'whatever'
...
>>> o = O()
>>> d = {o: 0}
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
d = {o: 0}
TypeError: unhashable type: 'O'
Run Code Online (Sandbox Code Playgroud)
后续问题是,我该如何解决我的个人问题?我有一个对象ChangeTracker
存储一个WeakKeyDictionary
指向多个对象的对象,在过去的某个时间点为每个对象提供它们的值.每当签入现有对象时,更改跟踪器会说明其新的pickle是否与旧的pickle相同,因此在此期间说明对象是否已更改.问题是,现在我甚至无法检查给定对象是否在库中,因为它使得它引发了一个关于不可对象的对象的异常.(因为它有一个__eq__
方法.)我该如何解决这个问题?
我找不到用matplotlib
Python库绘制任意行的方法.它允许绘制水平线和垂直线(与matplotlib.pyplot.axhline
和matplotlib.pyplot.axvline
,例如),但我没有看到如何通过两个特定点划一条线(x1, y1)
和(x2, y2)
.有办法吗?有一个简单的方法吗?
可能我错过了一些简单的东西,但我不明白如何使用Ruby的DelegateClass
方法,我的意思是何时使用它而不是SimpleDelegator
类.例如,以下所有内容似乎大部分相同:
require 'delegate'
a = SimpleDelegator.new([0])
b = DelegateClass(Array).new([0])
c = DelegateClass(String).new([0])
a << 1
b << 2
c << 3
p a # => [0, 1]
p b # => [0, 2]
p c # => [0, 3]
Run Code Online (Sandbox Code Playgroud)
请注意,传递给哪个类似乎并不重要DelegateClass
.
我知道可以从命令行调试Python脚本
python -m pdb my_script.py
Run Code Online (Sandbox Code Playgroud)
if my_script.py
是一个打算运行的脚本python my_script.py
.
但是,my_module.py
应该运行python模块python -m my_module
.甚至包含相对导入的脚本也应该运行python -m
.我怎么能python -m my_module
在pdb
控制下运行?以下不起作用:
python -m pdb -m my_module
Run Code Online (Sandbox Code Playgroud) S组合器的模拟是否可以仅使用标准函数(不通过公式定义)并且不使用lambda(匿名函数)在Haskell中表示?我期待它的类型(a -> b -> c) -> (a -> b) -> a -> c
.
例如,K组合器的模拟就是const
.
实际上我试图\f x -> f x x
用标准函数来表达函数,但是不能想到任何标准的非线性函数(这是一个多次使用它的参数的函数).
我想知道:有没有办法在Ruby中调用一个方法而不使用它的名字?
如果该方法是由某些元编程技术创建的,那么通过其名称调用它可能很难阅读.即使对于通常定义的方法,如果您不确定它的名称,或者它的名称很长,通过某个关键字(类似于super
)从内部调用它可能很方便.
我想制作一个自定义的单键Vim映射,既可以用来开始将宏记录到未命名的寄存器(q"
),也可以用来停止记录宏(q
).
如果Vim处于录制模式,我可以从Vim脚本中检测到吗?
如果可以检测录制模式,如果在录制模式下唤醒我的功能(停止录制)会有问题吗?我的意思是,是否可以将函数调用记录在宏内?
是否可以在(交互式)IPython会话中通过stdout
寻呼机传递输出,如less
?如果是这样,怎么样?
例如,在
In [1]: from some_module import function_that_prints_a_lot
In [2]: function_that_prints_a_lot()
... everything scrolls away ...
Run Code Online (Sandbox Code Playgroud)
我想翻阅stdout
输出function_that_prints_a_lot
.
另一个例子:
In [1]: %run script_that_prints_a_lot.py
Run Code Online (Sandbox Code Playgroud)
我查看了IPython 魔术命令,但没有找到任何解决方案.
最初(PEP 380),yield from
引入了语法以用于委托给“子生成器”。后来它与现在已弃用的基于生成器的协程一起使用。
我不知道yield from
一般可以应用什么样的对象。我的第一个猜想是它只需要__iter__
对象上的方法来返回迭代器。实际上,以下适用于 Python 3.8:
class C:
def __init__(self, n):
self.n = n
def __iter__(self):
return iter(range(self.n))
def g(n):
yield from C(n)
print(tuple(g(3)))
Run Code Online (Sandbox Code Playgroud)
但是,它也适用于一些asyncio.sleep(1)
没有__iter__
方法的等待对象,例如。
一般规则是什么?是什么决定了一个对象是否可以作为yield from
form的参数给出?
python ×5
python-3.x ×3
ruby ×2
combinators ×1
coroutine ×1
debugging ×1
delegation ×1
dynamic ×1
generator ×1
hash ×1
haskell ×1
inheritance ×1
ipython ×1
keyword ×1
macros ×1
matplotlib ×1
pdb ×1
s-combinator ×1
stdout ×1
vim ×1
yield-from ×1