我有一个对象,它有自己的内容(即某物的列表)和对另一个对象的引用,它与其链接。如何排除对另一个对象的引用进行深度复制?
from copy import deepcopy
class Foo:
def __init__(self, content, linked_to):
self.content = content
self.linked_to = linked_to
a1 = Foo([[1,2],[3,4]], None)
a2 = Foo([[5,6],[7,8]], a1)
a3 = deepcopy(a2) # <- I don't want there, that a3.linked_to will be copied
# I want that a3.linked_to will still point to a1
a3.linked_to.content.append([9,10])
print a1.content # [[1,2],[3,4]], but I want [[1,2],[3,4], [9,10]]
Run Code Online (Sandbox Code Playgroud) 我想在 Python 中利用 Literal 类型提示的优点,但似乎 Literal 没有被正确识别为字典键或列表:
from typing import Literal, Dict, List
T = Literal['foo', 'bar']
L = List[T]
D = Dict[T, int]
q: T = 'foo' # ok
l: L = ['foo', 'bar'] # Expected type 'List[Literal['foo', 'bar']]', got 'List[str]' instead
d: D = {'foo': 1} # Expected type 'Dict[Literal['foo', 'bar'], int]', got 'Dict[str, int]' instead
Run Code Online (Sandbox Code Playgroud)
如何在列表或字典键中正确使用文字类型?
假设有一个生产数据库,其中有一些数据。在下一个棘手的情况下,我需要迁移。
有一个模型(已经存在于db中),例如Model,它具有其他模型的外键。
class ModelA: ...
class ModelX: ...
class Model:
a = models.ForeignKey(ModelA, default = A)
x = models.ForeignKey(ModelX, default = X)
Run Code Online (Sandbox Code Playgroud)
我们需要再创建一个模型ModelY以供Model参考。创建Model对象时,对象应具有与某个ModelY对象相关的默认值,该默认值显然尚不可用,但我们应在迁移期间创建它。
class ModelY: ...
class Model:
y = models.ForeignKey (ModelY, default = ??????)
Run Code Online (Sandbox Code Playgroud)
因此,迁移顺序应为:
ModelY表格y在Model表中创建一个新字段,默认值取自上一段当然,我想使所有这些自动化。因此,为避免需要手动应用一次迁移,然后创建一些对象,然后写下其ID,然后将此ID用作新字段的默认值,然后才对这个新字段应用另一种迁移,就可以了。
我也想一步一步完成所有工作,因此在旧模型中同时定义ModelY一个新字段y,生成迁移,以某种方式对其进行修复,然后立即应用并使其生效。
是否有针对此类情况的最佳做法?特别是在哪里存储此新创建的对象的ID?同一数据库中有一些专用表?
我正在使用 Jupyter 并尝试使我的绘图具有交互性。
所以我有一个阴谋。我有一个 ipywidgets 按钮。
单击按钮时,我需要更新绘图,就像与滑块进行交互一样。
但我不能。
它仅在 matplotlib 使用“笔记本”后端时才有效,但看起来很糟糕。同时与任何类型的情节进行交互。有没有办法重现这一点,而不是使用交互?
#this works fine! But toolbar near the graph is terible
#%matplotlib notebook
#this does not work
%matplotlib inline
from matplotlib.pyplot import *
button = ipywidgets.Button(description="Button")
def on_button_clicked(b):
ax.plot([1,2],[2,1])
button.on_click(on_button_clicked)
display(button)
ax = gca()
ax.plot([1,2],[1,2])
show()
Run Code Online (Sandbox Code Playgroud) 我有枚举,我希望一些常量的行为类似于 0。默认情况下情况并非如此(这本身很奇怪)。我尝试将非零方法直接绑定到枚举成员,但它没有在 if 语句中调用。到底是怎么回事!?有没有明确的方法让 FOO 表现得像 0 一样?
from enum import Enum
class A(Enum):
FOO = 0
BAR = 1
if A.FOO: print 'foo!'
if A.BAR: print 'bar!'
setattr(A.FOO, '__nonzero__', (lambda self:False).__get__(A.FOO, A.FOO.__class__))
if A.FOO: print 'foo!'
print A.FOO.__nonzero__()
Run Code Online (Sandbox Code Playgroud)
输出
foo!
bar!
foo!
False
Run Code Online (Sandbox Code Playgroud)
更新:对于 Python 2.7 zvone 的解决方案如下所示并且工作正常:
from enum import Enum
class A(Enum):
FOO = 0
BAR = 1
def __nonzero__(self): return self!=A.FOO
if A.FOO: print 'foo!'
if A.BAR: print 'bar!'
Run Code Online (Sandbox Code Playgroud) 有时很难理解为什么某些固定代码被执行,而它似乎不应该被执行。所以我想打印所有的灯具名称,这些名称将由pytest解析以进行一些具体测试以进行更详细的分析,pytest中有这样的功能吗?
我的问题是关于交互式 Jupyter 笔记本。
我想显示 JavaScript 按钮并在单击按钮时将某些内容打印到单元格。
我们可以使用 ipywidgets 轻松做到这一点:
def OnClick(b=None): print 'qq'
b = widgets.Button(description='Button')
b.on_click(OnClick)
display(b)
Run Code Online (Sandbox Code Playgroud)
但是当我们跳转到纯 JavaScript 时,事情就出错了。即我有 JavaScript 按钮,在 on_click() 事件处理程序中我使用内核交互,如:
var kernel = IPython.notebook.kernel;
kernel.execute('onClick()');
Run Code Online (Sandbox Code Playgroud)
回调被调用成功(我通过哔声检查),但打印在单元格中没有输出,其中显示按钮。所以我想应该有一些魔法(就像 Python 世界中的一切!)来访问打印区域,你能帮我施展它吗?
ipython ipython-notebook jupyter jupyter-notebook ipywidgets
python ×6
ipywidgets ×2
jupyter ×2
deep-copy ×1
django ×1
enums ×1
ipython ×1
matplotlib ×1
mypy ×1
pycharm ×1
pytest ×1
python-2.7 ×1