小编Eri*_*zke的帖子

输入提示 @asynccontextmanager 的返回值的正确方法是什么?

使用装饰器为函数的返回添加类型提示的正确方法是什么@asynccontextmanager?这是我所做的两次尝试,但都失败了。

from contextlib import asynccontextmanager
from typing import AsyncContextManager


async def caller():
    async with return_str() as i:
        print(i)

    async with return_AsyncContextManager() as j:
        print(j)


@asynccontextmanager
async def return_str() -> str:
    yield "hello"


@asynccontextmanager
async def return_AsyncContextManager() -> AsyncContextManager[str]:
    yield "world"
Run Code Online (Sandbox Code Playgroud)

对于 vscode 中的 Pylanceij Pylance显示类型Any。我考虑过的其他想法:

  • 我想也许我可以将类型信息传递给装饰器本身(例如@asynccontextmanager(cls=str),但我找不到任何示例,或者我可以传递的参数的任何描述。
  • async with return_str() as i: # type: str也不行。即使确实如此,我也宁愿暗示函数定义,而不是在每次调用时都暗示。类型注释不是很 DRY。
  • 我尝试创建一个具有和函数AsyncContextManager的类,但没有成功。如果它有效的话我会回到那个,但我更喜欢让装饰器工作,因为它更简洁。__aenter()____aexit()__

这是我将鼠标悬停在该return_AsyncContextManager()函数上的屏幕截图,并显示 Pylance 弹出窗口显示它返回AsyncContextManager[_T] 在此输入图像描述

python type-hinting contextmanager python-asyncio visual-studio-code

12
推荐指数
1
解决办法
5543
查看次数

为什么我在一个环境中而不是另一个环境中的sbt中出现了冲突的交叉版本?

我有一个带有这些依赖项的sbt项目:

libraryDependencies ++= Seq(
  "org.scalatra"           %% "scalatra"          % ScalatraVersion,
  "org.scalatra"           %% "scalatra-scalate"  % ScalatraVersion,
  "org.scalatra"           %% "scalatra-specs2"   % ScalatraVersion   % "test",
  "ch.qos.logback"         %  "logback-classic"   % "1.1.2"           % "runtime",
  "org.eclipse.jetty"      %  "jetty-webapp"      % "9.1.5.v20140505" % "container",
  "org.eclipse.jetty"      %  "jetty-plus"        % "9.1.5.v20140505" % "container",
  "javax.servlet"          %  "javax.servlet-api" % "3.1.0",
  "org.sorm-framework"     %  "sorm"              % "0.3.18",
  "com.h2database"         %  "h2"                % "1.4.187",
  "org.fusesource.scalamd" %  "scalamd_2.10"      % "1.6"
)
Run Code Online (Sandbox Code Playgroud)

在一台机器上,我可以毫无问题地运行./sbt; 另一方面,我明白了

[error] Modules were resolved with conflicting cross-version suffixes in {file:/C:/dev/scalaspace/game-tracker/}game-tracker:
[error]    org.scala-lang.modules:scala-xml _2.11, _2.12.0-M1
[error] …
Run Code Online (Sandbox Code Playgroud)

scala sbt sorm

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

JUnit + DbUnit:在开发和测试环境之间切换数据库连接

我正在围绕现有项目设置一些测试脚手架.这包括使用JUnit和DbUnit的一些集成测试.我还设置了Jenkins安装以进行持续集成.

我的问题涉及更改开发和测试环境之间的数据库连接.我在本地安装了自己的产品堆栈,以便进行快速的临时测试和调查.在我开发的时候,我对我的私人数据库运行测试,因为它更快,我不会因为有问题的工作进程代码而毁掉任何其他人的日子.

签入代码后,Jenkins将运行我的测试.现在它仍然指向我的本地数据库.我更愿意让Jenkins针对不同的数据库运行测试,这个数据库位于测试环境中.

是否有最佳实践/策略/技术/等更改数据库连接以进行测试而无需更改代码?如果解决方案允许Jenkins对多个DB运行相同的测试,那么奖励点(应该是可能的,因为DbUnit是不可知的).


编辑更多信息:

该产品很大,具有许多不同的交互组件(通常在单独的vms /进程中).在实时系统中,不同的进程通常通过数据库进行通信.IE,UI进程将更改写入表,后端进程轮询该表以进行更改.是的,太可怕了.对于集成测试,我使用UI配置系统并使用DbUnit捕获该状态.然后,我可以针对该"输入"运行测试.

我的组件和所有新组件都由maven管理.数据库连接当前在测试设置中是硬编码的.DbUnit系统有效; 我只是希望能够切换我的测试引用的数据库,具体取决于它们是在我的开发环境中运行,还是由Jenkins在测试环境中运行.

java testing junit dbunit development-environment

5
推荐指数
1
解决办法
4025
查看次数

在某些情况下,Swing app不会显示

我正在编写一个实用程序来帮助测试更大的系统,如果我在系统中运行它,我的UI根本就不显示.我自己运行时工作正常.更多细节:

  1. 我正在测试的系统有很多进程,由一个控制器管理.部署后,controller.exe会生成并终止子进程,包括我的java应用程序.当由控制器启动时,我的应用程序运行良好(工作,生成日志等)但Swing UI根本不渲染.
  2. 我可以从命令行自己启动我的应用程序,并且UI显示得很好.根据Process Explorer,Path,Command Line和Current Directory都与从控制器启动应用程序时观察到的值相同.
  3. 当应用程序无法访问时,单击Process Explorer中的"Bring to Front"会弹出一个对话框."这个过程找不到可见的窗户." 单击手动生成的进程上的相同按钮可将Swing UI按预期方式显示在前面.
  4. 我在Windows XP中测试它.控制器进程在SYSTEM下运行.我使用"at 09:45/interactive cmd.exe"技巧为我的手动启动生成一个命令提示符作为SYSTEM.Process Explorer验证两个方法(手动/控制器)将java进程生成为SYSTEM.
  5. 这两个过程之间唯一明显的区别是父母.系统进程作为controller.exe的子进程生成,而我的手动执行是cmd.exe的子进程.
  6. 我使用jdwp远程调试了隐形进程,一切看起来都很正常.UI代码执行,不会抛出任何异常,我的JLists甚至会填充他们监视的数据.据我所知,一切正常; 我只是看不到任何一个.

如果在其他地方已经回答,我道歉.我尽力搜索,但我能找到的所有问题都是关于某些组件无法呈现,而不是整个应用程序无法显示.

谢谢!

编辑:根据反馈,我交换了一个尽可能小的演示程序.这是整个代码:

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class AceProbe
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        JFrame frame = new JFrame("Visible?");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(new JLabel("Test"), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

从命令行运行它会按预期显示窗口.但是,当控制器生成进程时,不会显示任何内容.当由控制器生成时,我可以使用远程调试进程-agentlib:jdwp=transport=dt_socket,suspend=y,server=y,address=8000并验证所有线程是否按预期生成,并且不会抛出任何异常.

我的直觉来自于控制器处于一些奇怪的图形配置中,并且由于父进程是新的java进程,也许Swing没有使用正确的GraphicsDevice?我尝试添加此代码:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
for(GraphicsDevice d : ge.getScreenDevices())
{ …
Run Code Online (Sandbox Code Playgroud)

java swing windows-xp

3
推荐指数
1
解决办法
596
查看次数

SQL Server触发器更新(col)如果插入的值等于原始值,则为true还是false?

鉴于此简单示例触发器:

CREATE TRIGGER example_update
ON example_table
FOR UPDATE
AS BEGIN
   if update(someColumn) begin
      update example_table SET last_update_date = GETDATE() WHERE id IN (SELECT id FROM inserted);
   end
END
Run Code Online (Sandbox Code Playgroud)

如果someColumn的旧值和someColumn的新值相等,update(someColumn)是返回true还是false?例如,如果我运行这两个SQL语句:

UPDATE example_table SET someColumn=1;
UPDATE example_table SET someColumn=1;
Run Code Online (Sandbox Code Playgroud)

第二个语句是否触发了触发器中的if块?

另外,如果我执行此操作,我的推定是正确的:

UPDATE example_table SET otherColumn=1;
Run Code Online (Sandbox Code Playgroud)

然后在我的触发器中更新(someColumn)将返回false.

我很抱歉,如果这是一个重复:该函数被称为更新的事实已经使我的搜索结果充满了更新状态(与更新函数非常不同),并且使我很难确定这种行为.

sql t-sql sql-server triggers

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