mypy非常方便并且捕获了很多错误,但是当我编写"科学"应用程序时,我经常最终会这样做:
def my_func(number: Union[float, int]):
# Do something
Run Code Online (Sandbox Code Playgroud)
number是浮点数还是int,具体取决于用户的输入.有官方的方法吗?
我正在尝试用cx_freeze和esky构建一个应用程序.它之前正在工作(好吧,也许几个月前.从那时起,python 3.5就灭了).
我有以下例外:
File "/usr/lib/python3.5/site-packages/esky/util.py", line 578, in compile_to_bytecode
loader = importlib._bootstrap.SourceLoader()
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceLoader'
Run Code Online (Sandbox Code Playgroud)
我正在使用:
我在Manjaro(Linux)上.我无法弄清楚问题的来源.你可以帮我一把吗?
我需要在一个figureCanvas中有2个可拖动的点.但是我有一个辅助约束:2个点必须用一条线连接起来.当我拖动一个点时,当然(否则不会有趣),必须动态绘制线,并且仍然链接到2个点.

我设法创建了2个可拖动的点,主题是: Matplotlib以交互方式拖动重叠点
我通过FigureCanvas的子类修改了一些代码来使用它(稍后在PyQt应用程序中包含图形):
import matplotlib.pyplot as plt
import matplotlib.patches as patches
class DraggablePoint:
# https://stackoverflow.com/questions/21654008/matplotlib-drag-overlapping-points-interactively
lock = None # only one can be animated at a time
def __init__(self, parent, x=0.1, y=0.1):
self.parent = parent
self.point = patches.Ellipse((x, y), 0.01, 0.03, fc='r', alpha=0.5)
self.x = x
self.y = y
parent.fig.axes[0].add_patch(self.point)
self.press = None
self.background = None
self.connect()
def connect(self):
'connect to all the events we need'
self.cidpress = self.point.figure.canvas.mpl_connect('button_press_event', self.on_press)
self.cidrelease = self.point.figure.canvas.mpl_connect('button_release_event', self.on_release)
self.cidmotion = self.point.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
def …Run Code Online (Sandbox Code Playgroud) 我一直试图找到请求模块关于压缩的默认行为,但我找不到任何东西,所以我在这里问:
请求模块是否默认要求服务器进行压缩?我们必须在标题中指定它吗?
我在这里找到一个关于urllib的页面,据说标题必须要求压缩才能得到它:
http://www.diveintopython.net/http_web_services/gzip_compression.html
请求是否一样?
既然python 3.6(或3.4?我不记得了)我们可以注释一个函数.例如:
def getVersion() -> str:
Run Code Online (Sandbox Code Playgroud)
现在当函数返回一个元组时会发生什么?我们能做到这一点:
def func() -> tuple:
Run Code Online (Sandbox Code Playgroud)
但是,如果我们知道元组是两个整数的元组?我在这里阅读:如何注释多个返回值的类型?我们可以这样做:
def func() -> Tuple[int, int]
Run Code Online (Sandbox Code Playgroud)
但它需要导入typing模块.
我也试过了:
def func() -> (int, int):
Run Code Online (Sandbox Code Playgroud)
它不会崩溃.
什么是正确的方法?
我越来越多地使用类型提示和 mypy。但是,我对何时应该显式注释声明以及何时可以由 mypy 自动确定类型有一些疑问。
前任:
def assign_volume(self, volume: float) -> None:
self._volume = volume * 1000
Run Code Online (Sandbox Code Playgroud)
我应该写吗
self._volume: float = volume *1000
Run Code Online (Sandbox Code Playgroud)
在这种情况下?
现在,如果我有以下功能:
def return_volume(self) -> float:
return self._volume
Run Code Online (Sandbox Code Playgroud)
在我的代码中的某处:
my_volume = return_volume()
Run Code Online (Sandbox Code Playgroud)
我应该写:
my_volume: float = return_volume()
Run Code Online (Sandbox Code Playgroud) 我不知道sqlalchemy查询返回哪种对象。
entries = session.query(Foo.id, Foo.date).all()
Run Code Online (Sandbox Code Playgroud)
条目中每个对象的类型似乎是sqlalchemy.util._collections.result,但是from sqlalchemy.util._collections import resultpython解释器中的快速提示会引发ImportError。
我最终想要做的是键入提示此功能:
def my_super_function(session: Session) -> ???:
entries = session.query(Foo.id, Foo.date).all()
return entries
Run Code Online (Sandbox Code Playgroud)
我应该代替???什么?mypy(在这种情况下)似乎可以使用,List[Tuple[int, str]]因为是的,确实可以访问我的条目,就像它们是元组一样,但是我也可以使用来访问它们entry.date。
我想用 matplotlib(补丁)绘制圆圈,并注释它们。注释将是一个单词,它需要位于圆圈的中心。
但是注释不是居中的,无论是水平还是垂直。为了做到这一点,我需要访问文本的尺寸。
有没有办法在“坐标系”中访问文本的尺寸?。例如,如果圆的半径为 15(15 个东西,不是像素),则文本的长度为 12 个东西(不是像素)。
我对如何做到这一点的任何其他建议持开放态度。
到目前为止,这是我的代码:
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
fig, ax = plt.subplots()
ax = fig.add_subplot(111)
x = 0
y = 0
circle = plt.Circle((x, y), radius=1)
ax.add_patch(circle)
label = ax.annotate("cpicpi", xy=(x, y), fontsize=30)
ax.axis('off')
ax.set_aspect('equal')
ax.autoscale_view()
plt.show()
Run Code Online (Sandbox Code Playgroud) 这些天我花了一些时间解决一个问题。我有一组数据:
y = f(t),其中 y 是非常小的浓度 (10^-7),t 是秒。t 从 0 到 12000 左右不等。
测量遵循既定模型:
y = Vs * t - ((Vs - Vi) * (1 - np.exp(-k * t)) / k)
Run Code Online (Sandbox Code Playgroud)
我需要找到 Vs、Vi 和 k。所以我使用了curve_fit,它返回了最佳拟合参数,并绘制了曲线。
然后我使用了一个类似的模型:
y = (Vs * t/3600 - ((Vs - Vi) * (1 - np.exp(-k * t/3600)) / k)) * 10**7
Run Code Online (Sandbox Code Playgroud)
通过这样做,t 是一个小时数,而 y 是一个介于 0 和大约 10 之间的数字。返回的参数当然是不同的。但是当我绘制每条曲线时,我得到的是:
http://i.imgur.com/XLa4LtL.png
绿色拟合是第一个模型,蓝色拟合是“标准化”模型。红点是实验值。
拟合曲线不同。我认为这不是预期的,我不明白为什么。如果数字“合理”,计算是否更准确?
我最近发现了mypy,并且希望对其进行类型检查。
我有一个Connector基类:
class Connector():
... some methods, but no __init__ ...
Run Code Online (Sandbox Code Playgroud)
我有几个子类,它们都是连接器,但类型不同:
class Siphon(Connector)
def __init__():
short_name = "S"
class Tube(Connector)
def __init__():
short_name = "T"
Run Code Online (Sandbox Code Playgroud)
使用这些对象时,通常将它们放在列表中:
c1 = Siphon()
c2 = Tube()
list_connectors: List[Connector] = list()
list_connectors.append(c1)
list_connectors.append(c2)
Run Code Online (Sandbox Code Playgroud)
现在让我们说我想编写一个函数以列表形式返回所有连接器的所有短名称。我会这样写:
def get_names(list_connectors: List[Connector]) -> List[str]:
tmp_list: List[str] = list()
for c in list_connectors:
tmp_list.append(c.short_name)
return tmp_list
Run Code Online (Sandbox Code Playgroud)
当我这样做时,mypy抱怨:
error: "Connector" has no attribute "short_name"
Run Code Online (Sandbox Code Playgroud)
的确如此,基类连接器没有此属性,只有子类。但是所有连接器子类都将具有此属性。
我该如何纠正?我不能在这里使用类属性,因为我所有的子类都需要它们自己的short_name属性。
我是否应该在get_names函数的类型提示中使用Union (在现实生活中,连接器的类型要多于2种,并且API的用户可以添加自己的连接器)?
我也不确定我可以编写一个基本__init_函数并在子类中重写它,因为所有子类都有不同的init
python ×10
mypy ×4
type-hinting ×3
annotations ×2
matplotlib ×2
cx-freeze ×1
esky ×1
numpy ×1
pyqt ×1
sqlalchemy ×1