我目前正在编写一个用于手动将数据从一张纸复制到数据库的应用程序.此应用程序有许多小部件,用户可以在其中输入数据.为了保持UI有点整洁,我决定使用选项卡式窗格,将输入字段分成逻辑单元.
该应用程序最重要的特性是只能通过键盘使用.所以你应该可以通过击键来切换标签.默认情况下,可以使用CTRL+PgUp/PgDown.但是,作为一个额外的便利,我想在用户将焦点从当前选项卡上的最后一个小部件转移出来后立即激活下一个选项卡.
因此,如果用户将焦点放在最后一个文本字段上,并按下Tab键,我想激活下一个标签,并将焦点放在其中的第一个小部件上.
为了解决这个问题,我将jTabbedPane标记为focusCycleRootProvider并添加了一个自定义FocusTraversalPolicy.我目前的问题是:一旦我以编程方式激活下一个选项卡(使用setSelectedIndex),这在getComponentAfter方法中发生,该方法getComponentAfter第二次执行.这打败了我目前的逻辑.我似乎无法找到防止这种情况发生的方法.有任何想法吗?
在下面的示例中,您将看到一个ArrayIndexOutOfBoundsException.这getComponentAfter是因为被调用了两次.一旦进入第一个选项卡,一次进入第二个选项卡.但两次使用与参数相同的组件.这意味着,第二次,for循环将找不到匹配的组件,因此计数器i将与第二个选项卡 + 1 中的组件一样大.这会导致异常.
/*
* TestFrame.java
*
* Created on Apr 18, 2011, 4:37:52 PM
*/
package testrun;
import java.awt.Component;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
/**
*
* @author malbert
*/
public class TestFrame extends javax.swing.JFrame {
/** Creates new form TestFrame */
public TestFrame() {
initComponents();
jTabbedPane1.setFocusTraversalPolicyProvider(true);
jTabbedPane1.setFocusTraversalPolicy(new EasyTabberFocusTraversalPolicy(jTabbedPane1));
jTabbedPane1.addFocusListener(new …Run Code Online (Sandbox Code Playgroud) 使用位置数据文件时,突出显示特定列通常非常有用.在这样的文件中,通常有巨大的"区域"填充空格(或NULL值)并且只有非常稀疏的数据点.在这种情况下,读取文件变得困难.
这是一个示例摘录:
462
63082
01089
75518 735301
53473 017146
37217
07
940376
762 2842
88331
40680 8928
645718
0131
03522
47210 27431
93837
8825072 49479415
52084 8940
0591705 205635
525429
65339 300
0397
1983
0
2605768
121991 648
3892
1260
Run Code Online (Sandbox Code Playgroud)
我发现只需突出显示特定列就很有帮助.起初,我试图用一个常规的:match,但是这竟然是路对庞大的数据文件放缓.我把这个作为另一个问题发布.答案很简单.cursorcolumn(从vim 7.3开始可用)可以设置为一个范围,并且速度快得多,因为它不需要匹配字符.
实施建议的解决方案,我看到它的工作.但它很麻烦,并且 - 知道vim - 应该有一种更简单的方法来指定它.
是否可以将cursorcolumn范围设置为当前所选(可视)块的列?
目前我已经拥有Docker v.1.7并且我想将其升级到最新版本(目前为1.8).
重要部分:我想在不重新安装Docker和boot2docker的情况下执行此操作.我无法找到任何关于它的信息.
可能吗?我怎么能这样做?
搜索此主题时,我遇到了以下问题:如何表示整数无穷大?
我同意 Martijn Peeters 的观点,即添加一个单独的特殊无穷大值int可能不是最好的想法。
然而,这使得类型提示变得困难。假设以下代码:
myvar = 10 # type: int
myvar = math.inf # <-- raises a typing error because math.inf is a float
Run Code Online (Sandbox Code Playgroud)
但是,代码在任何地方都按其应有的方式运行。我的类型提示在其他任何地方都是正确的。
如果我改写以下内容:
myvar = 10 # type: Union[int, float]
Run Code Online (Sandbox Code Playgroud)
我可以math.inf毫不费力地分配。但现在任何其他浮动也被接受。
有没有办法正确限制类型提示?或者我type: ignore每次分配无穷大时都被迫使用?
在某些情况下,对于系统脚本,我喜欢保留扩展名并使用 shebang。不幸的是 pytest 似乎忽略了这些文件并且 doctest 失败了,因为它无法导入这些文件。例子:
\n#!/usr/bin/python3\n\n# filename: "my-nagios-plugin"\n\nimport sys\n\ndef runcheck(value):\n """\n Example check\n\n >>> runcheck(3)\n 0\n >>> runcheck(10)\n 1\n """\n return 1 if value > 5 else 0\n\nif __name__ == "__main__":\n sys.exit(runcheck(int(sys.argv[1])))\nRun Code Online (Sandbox Code Playgroud)\n文档测试输出:
\n\xe2\x80\xba python3 -m doctest my-nagios-plugin \xe2\x9c\x97: 130\n**********************************************************************\nFile "my-nagios-plugin", line 13, in my-nagios-plugin\nFailed example:\n runcheck(3)\nException raised:\n Traceback (most recent call last):\n File "/usr/lib/python3.6/doctest.py", line 1330, in __run\n compileflags, 1), test.globs)\n File "<doctest my-nagios-plugin[0]>", line 1, in <module>\n runcheck(3)\n NameError: name 'runcheck' is not defined\n**********************************************************************\nFile …Run Code Online (Sandbox Code Playgroud) 以下代码定义了一个简单的协议和一个几乎实现该协议的类。唯一的区别是该run()方法在协议中接受一个参数,但它不是以这种方式实现的。
然而,isinstance()检查返回 true,这是出乎意料的。
据我了解PEP-544这应该有效。尽管检查函数签名还不清楚。
当在成员中使用错误的数据类型(例如,在协议中将ORDER其更改为)时,也会发生同样的问题。str
我知道类型提示只是......嗯......“提示”并且在运行时不会强制执行。
但是,在我的应用程序中,确保某些类遵循定义的协议以获得更清晰的错误消息将很有用。它使用插件架构,加载插件后,如果该插件遵循所需的协议,则进行快速“健全性检查”会很有用,如果没有,则提供早期且有用的错误消息,而不是导致异常稍后在下游。
from typing_extensions import Protocol, runtime_checkable
@runtime_checkable
class PFoo(Protocol):
ORDER: int
def run(self, a: int) -> None:
...
class Hello:
ORDER = 10
def run(self) -> None:
print(1)
# Returns "True" evn though the signature of "run()" doesn't match
print(isinstance(Hello(), PFoo))
Run Code Online (Sandbox Code Playgroud) 我们目前正在维护用多个 HTTP 框架(Flask、aiohttp 和 FastAPI)编写的代码。重写它们以便它们都使用相同的框架目前是不可行的。我想在这些应用程序之间共享一些代码,这些代码非常适合中间件(日志记录配置、监控、身份验证等)。
最初的实现是通过子类化 Flask 来完成的,并且在所有基于 Flask 的应用程序中运行得非常好。但它在 aiohttp 或 FastAPI 中无法使用。
创建一个与框架无关的实现是可行的(理论上),今天早上我采用了一个更简单的案例,并成功地将其转换为 WSGI 中间件,并且能够将其集成到 Flask 应用程序中。
但 ASGI 给我带来了一些麻烦,因为没有太多关于纯 ASGI中间件的文档。所有示例都展示了如何为其框架编写中间件。
ASGI 官方文档在该主题上也非常“精简”。据我所知,它应该看起来像这样(附带问题:“传递给构造函数的第二个参数是什么?”):
class MyMiddleware:
def __init__(self, app, something) -> None:
self.app = app
self.something = something # <- what is this second argument?
async def __call__(self, scope, receive, send):
print("Hello from the Middleware")
await self.app(scope, receive, send)
Run Code Online (Sandbox Code Playgroud)
我以Starlette TimingMiddleware作为灵感,但我无法将它与aiohttp. 可能是因为他们的实现略有不同。
考虑到 ASGI 规范中有一个中间件部分,并且两者都aiohttp实现Starlette了该规范,难道不应该有一种方法来编写一个可以在两者中工作的中间件吗?
如果是的话,我错过了什么?
假设我有一个包,它在代码的某处调用一个可执行文件(例如第三方 c/java 程序)。让我们进一步假设,应用程序足够小/微不足道,可以与包捆绑在一起。例如单个可执行文件 ( cfoo)。
我可以继续,并将文件放入以下结构中:
.
|-- foo
| |-- __init__.py
| |-- __init__.pyc
| |-- core.py
| |-- corebin
| | `-- cfoo
| `-- foomain.py
`-- setup.py
Run Code Online (Sandbox Code Playgroud)
并准备一个setup.py如下:
from setuptools import setup
setup(
name='foo',
version='1.0',
packages=['foo'],
scripts=['foo/foomain.py'],
package_data={'foo': ['corebin/*']},
zip_safe=False
)
Run Code Online (Sandbox Code Playgroud)
这将使我能够正确安装软件包。后来,在包代码中,我可以这样做:
from subprocess import call
import pkg_resources as res
def main():
fn = res.resource_filename('foo', 'corebin/cfoo')
print "Resource located at:", fn
call([fn])
Run Code Online (Sandbox Code Playgroud)
不幸的是,可执行文件将在没有设置可执行标志的情况下安装。即使原始文件已设置。chmod在setup.py脚本末尾添加调用并不容易,因为首先需要找出正确的安装路径。我尝试过,resource_filename但返回了本地文件(如“预安装”)。
如何解决这个问题?还 …
我的一位同事最近注意到正常git log命令与以下别名之间存在差异:
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘后,我们发现它可能与cygwin bash有关.
以下是我们的发现:
git log --graph
所有提交都可见
git log --oneline
一些承诺失踪......好吧!让我们通过将输出重定向到文本文件来准备错误报告:
git log --oneline > test.txt
唉,所有提交都在test.txt?!?让我们通过拆分别名来进一步调查.删除颜色代码:
git log --graph --pretty=format:'%h - %d %s (%cr) <%an>'
一些提交缺失.所以它必须是变量之一......
[...后来有些frobnications ...]
git log --graph --pretty=format:'%h - %d %s (%cr)'
所有提交都可见
git log --graph --pretty=format:'%h - %d %s <%an>'
所有提交都可见
在某些变量组合之后似乎会破裂.在这种情况下(%cr) <%an>
我也在linux上尝试了相同的存储库,在那里,它按预期工作(即所有提交都显示在日志中).
我们想知道为什么会这样.
我有一个使用的项目,SafeConfigParser我希望它与Python2和3兼容.现在,SafeConfigParser自Python 3.2以来我已弃用,我发现弃用警告很烦人.所以我开始做我的事来解决这个问题.
第一个(和更老的,已经解决的问题):SafeConfigParser是Python2中的旧式类,所以我不能super在我的后代类中调用.为了获得更一致的行为,我写了以下内容:
try:
# Python 2
class ConfigResolverBase(object, SafeConfigParser):
"""
A default "base" object simplifying Python 2 and Python 3
compatibility.
"""
pass
except TypeError:
# Python 3
class ConfigResolverBase(SafeConfigParser):
"""
A default "base" object simplifying Python 2 and Python 3
compatibility.
"""
pass
Run Code Online (Sandbox Code Playgroud)
如果有必要,这样可以使课程成为新式.为了摆脱DeprecationWarning我,我将代码更改为:
if sys.hexversion < 0x030000F0:
# Python 2
class ConfigResolverBase(object, SafeConfigParser):
"""
A default "base" object simplifying Python 2 and Python …Run Code Online (Sandbox Code Playgroud) python ×6
type-hinting ×2
asgi ×1
boot2docker ×1
cygwin ×1
distribute ×1
distutils ×1
docker ×1
git ×1
highlighting ×1
java ×1
msysgit ×1
mypy ×1
pytest ×1
setup.py ×1
super ×1
swing ×1
unit-testing ×1
vim ×1
virtualenv ×1
windows ×1