小编Jul*_*éon的帖子

漂亮的 ConfigObject 打印?

我有这个 groovy 程序,它使用 ConfigObject 创建一个 groovy 配置文件。设置 ConfigObject 后,将使用以下命令将其写入文件:

myFile.withWriter {writer -> myConfigObject.writeTo(writer)}
Run Code Online (Sandbox Code Playgroud)

这导致 ConfigObject 的每个属性都写在一行上。例如,地图将打印为:

graphs=[["type":"std", "host":"localhost", "name":"cpurawlinux"], ["type":"std", "host":"localhost", "name":"memory"], ["type":"std", "host":"localhost", "name":"udp"] ... ]
Run Code Online (Sandbox Code Playgroud)

如果有人必须看的话,这是非常难以阅读的。有没有办法获得更友好的输出?像这样的东西会很棒:

graphs=[
    ["type":"std", "host":"localhost", "name":"cpurawlinux"],
    ["type":"std", "host":"localhost", "name":"memory"],
    ["type":"std", "host":"localhost", "name":"udp"]
    ...
]
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建自己的writeTo,但是 Groovy 中不是已经有这样的东西了吗?

java formatting groovy configuration-files

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

使用Spock进行模拟时,如何消除对参数数量的限制?

模拟方法时,是否可以接受任意数量的参数?

例如,如果我想模拟这两个方法:

foo(String s);
foo(String s, int i);
Run Code Online (Sandbox Code Playgroud)

现在,在我的测试中,我这样做:

myMockedClass.foo(_) >> x
myMockedClass.foo(_, _) >> x
Run Code Online (Sandbox Code Playgroud)

有没有办法同时模拟两者?就像是:

myMockedClass.foo(*) >> x
Run Code Online (Sandbox Code Playgroud)

(这不起作用)

java mocking spock

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

NAT转换不在网络内部工作(发夹条件)

我正在写一个P2P应用程序.对等体定期ping主服务器以更新其当前的IP /端口,因此当对等体想要到达另一个时,它可以向服务器询问该信息.现在,对等体使用UPnP配置NAT(用于经典家庭设置)可从外部访问.

所以一切正常,除非对等方的客户端试图到达另一个(或同一个)对等方的服务器,并且两者都在同一个NAT之后.由于在这种情况下客户端试图从NAT后面到达其自己的"外部"(公共)IP地址,因此NAT不执行端口转发并且无法路由IP数据包.

现在我想到两个解决方案:

  • 使用UPnP查询NAT以查看端口转发到的本地IP
  • 在主服务器上存储对等体的内部IP

你能想到其他解决方案吗?主流P2P应用程序实施哪些策略来解决这个问题?

networking routing p2p nat

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

在scala中选择正确的异常处理

我是Scala的新手,对于处理异常的各种方式以及寻找有关该主题的最佳实践建议感到有些困惑.我正在编写一个使用现有阻止SDK检索客户的简单方法.可能的结果是:

  1. 找到了客户
  2. 找不到客户(从SDK返回为NotFoundException)
  3. 与远程服务器通信时出错(SDK引发其他一些异常)

所以我希望我的方法有一个返回类型Future[Option[Customer]],并返回上面的每个案例:

  1. 成功的未来:一些(客户)
  2. 成功的未来:没有
  3. 失败的未来

这是我用try/catch写的:

private def findCustomer(userId: Long): Future[Option[Customer]] = future {
  try {
    Some(gateway.find(userId))
  } catch {
    case _: NotFoundException => None
  }
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,对我来说似乎很干净,但似乎并不是真正的"Scala方式" - 我被告知要避免使用try/catch.所以我一直在寻找一种方法来改写它Try.

这里有2个变体(我认为)表现完全相同,使用a Try.

变式A:

private def findCustomer(userId: Long): Future[Option[Customer]] = future {
  Try(
    Some(gateway.find(userId))
  ).recover {
    case _: NotFoundException => None
  }.get
}
Run Code Online (Sandbox Code Playgroud)

变式B:

private def findCustomer(userId: Long): Future[Option[Customer]] = future {
  Try(
    Some(gateway.find(userId))
  ).recover {
    case _: NotFoundException => None
  }
} …
Run Code Online (Sandbox Code Playgroud)

coding-style scala exception-handling

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

祖先是否自动"放入"数据存储区?

我刚刚开始使用Google App Engine,我对本教程的第一个数据存储示例感到有些困惑.

在此示例中,每次将问候语放入数据存储区时,其父级都将设置为根据留言簿名称构建的密钥:

 greeting = Greeting(parent=guestbook_key(guestbook_name))
Run Code Online (Sandbox Code Playgroud)

def guestbook_key(guestbook_name=None):
    """Constructs a datastore key for a Guestbook entity with guestbook_name."""
    return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook')
Run Code Online (Sandbox Code Playgroud)

让我感到困惑的是,它guestbook_name本身从未明确放入数据存储区.那些不在数据存储区中的孩子的问候也是如此?或者以guestbook_name某种方式自动存储?

google-app-engine google-cloud-datastore

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

pickle 和 tkinter 的问题

为了学习 tkinter,我正在制作一个简单的围棋游戏程序。我现在希望能够使用 pickle 保存游戏,但是当我尝试 pickle 我的GoBoardModel对象时,我得到:

PicklingError: Can't pickle 'tkapp' object: <tkapp object at 0x01FCB090>
Run Code Online (Sandbox Code Playgroud)

我想这是因为虽然 GUI 和围棋板的模型分离得很好,但模型仍然引用视图来推送一些东西,所以 pickle 可能会尝试腌制一些 tk 东西。当然,我只想 pickle 模型,那么有什么方法可以告诉 pickle 不要关心对 GUI 的引用吗?或者用另一种方法来解决这个问题?

我知道我可以摆脱这个参考,但我来这里是为了学习:)

python tkinter pickle

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

Kotlin:定义 val 时处理异常

我正在开发一个 kotlin 网络后端并且有这样的东西:

try {
    val uuid = UUID.fromString(someString)
} catch (e: IllegalArgumentException) {
    throw BadRequestException("invalid UUID")
}

doSomething(uuid)
Run Code Online (Sandbox Code Playgroud)

上面的代码无法编译,因为uuid它在try块外未解析。

我可以想象的替代方案是:

  • doSomething(uuid)在 try 块内移动,但我宁愿避免这种情况,所以我不会意外地捕捉到其他一些潜在IllegalArgumentException的问题doSomething(如果由于某种原因发生这种情况,我希望事情失败并在我的日志中获得 500,以便我可以进行调查)
  • 改用可空值var并将其初始化为空值,但这似乎有点难看?

throw BadRequestException否则这种模式运行良好,所以我不想更改方法的返回类型或类似的东西以避免抛出。

在 Kotlin 中是否有更好/更优雅/推荐的模式?

exception kotlin

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