小编Ale*_*xey的帖子

如何在运行时动态更改实例的基类?

本文有一个片段__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类的属性在运行时动态添加此继承关系.但是,如果您更改FriendlyPerson成为新的样式类(通过继承自object),则会收到以下错误:

TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Run Code Online (Sandbox Code Playgroud)

关于这一点的谷歌搜索似乎表明,在运行时更改继承层次结构时,新样式类和旧样式类之间存在一些不兼容性.具体来说:"新式类对象不支持赋予其基础属性".

我的问题是,是否有可能通过使用__mro__属性使上述Friendly/Person示例在Python 2.7+中使用新式类工作?

免责声明:我完全意识到这是一个模糊的代码.我完全意识到,在实际的生产代码中,这样的技巧往往难以理解,这纯粹是一个思想实验,并且可以让人们了解Python如何处理与多重继承相关的问题.

python inheritance dynamic

68
推荐指数
3
解决办法
3万
查看次数

定义`__eq__`的类型是不可用的?

将一个功能移植到我的程序的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__方法.)我该如何解决这个问题?

python hash python-3.x

66
推荐指数
3
解决办法
9599
查看次数

如何用matplotlib画一条线?

我找不到用matplotlibPython库绘制任意行的方法.它允许绘制水平线和垂直线(与matplotlib.pyplot.axhlinematplotlib.pyplot.axvline,例如),但我没有看到如何通过两个特定点划一条线(x1, y1)(x2, y2).有办法吗?有一个简单的方法吗?

python matplotlib python-3.x

37
推荐指数
4
解决办法
11万
查看次数

何时使用Ruby DelegateClass而不是SimpleDelegator?(DelegateClass方法与SimpleDelegator类)

可能我错过了一些简单的东西,但我不明白如何使用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.

ruby design-patterns delegation

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

如何调试从命令行使用python -m运行的Python模块?

我知道可以从命令行调试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_modulepdb控制下运行?以下不起作用:

python -m pdb -m my_module
Run Code Online (Sandbox Code Playgroud)

python debugging python-module pdb

24
推荐指数
4
解决办法
1万
查看次数

Haskell中的S组合子

S组合器的模拟是否可以仅使用标准函数(不通过公式定义)并且不使用lambda(匿名函数)在Haskell中表示?我期待它的类型(a -> b -> c) -> (a -> b) -> a -> c.

例如,K组合器的模拟就是const.

实际上我试图\f x -> f x x用标准函数来表达函数,但是不能想到任何标准的非线性函数(这是一个多次使用它的参数的函数).

haskell combinators s-combinator

16
推荐指数
2
解决办法
2286
查看次数

Ruby:有一个关键字可以从内部调用一个方法(类似于super)吗?

我想知道:有没有办法在Ruby中调用一个方法而不使用它的名字?

如果该方法是由某些元编程技术创建的,那么通过其名称调用它可能很难阅读.即使对于通常定义的方法,如果您不确定它的名称,或者它的名称很长,通过某个关键字(类似于super)从内部调用它可能很方便.

ruby keyword

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

我可以从Vim脚本功能中检测Vim宏录制模式,并在Vim宏录制模式下调用此功能吗?

我想制作一个自定义的单键Vim映射,既可以用来开始将宏记录到未命名的寄存器(q"),也可以用来停止记录宏(q).

如果Vim处于录制模式,我可以从Vim脚本中检测到吗?

如果可以检测录制模式,如果在录制模式下唤醒我的功能(停止录制)会有问题吗?我的意思是,是否可以将函数调用记录在宏内?

vim macros

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

在IPython中分页stdout输出

是否可以在(交互式)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 魔术命令,但没有找到任何解决方案.

stdout ipython

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

“yield from”可以与哪些对象一起使用?

最初(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 fromform的参数给出?

python generator coroutine python-3.x yield-from

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