我很好奇在Python中定义值对象的好方法.每个维基百科:" 价值对象是一个小对象,代表一个简单的实体,其相等性不是基于身份:即当两个价值对象具有相同的价值时,它们是相同的,不一定是同一个对象".在Python中,本质上意味着重新定义__eq__和__hash__方法,以及不变性.
标准namedtuple似乎是几乎完美的解决方案,除了它们与PyCharm等现代Python IDE不能很好地兼容.我的意思是IDE不会真正提供有关定义为类的任何有用的见解namedtuple.虽然可以使用这样的技巧将docstring附加到这样的类:
class Point2D(namedtuple("Point2D", "x y")):
"""Class for immutable value objects"""
pass
Run Code Online (Sandbox Code Playgroud)
根本没有地方可以对构造函数参数进行描述并指定它们的类型.PyCharm非常聪明,可以猜测Point2D"构造函数"的参数,但类型方面它是盲目的.
这段代码推入了一些类型信息,但它不是很有用:
class Point2D(namedtuple("Point2D", "x y")):
"""Class for immutable value objects"""
def __new__(cls, x, y):
"""
:param x: X coordinate
:type x: float
:param y: Y coordinate
:type y: float
:rtype: Point2D
"""
return super(Point2D, cls).__new__(cls, x, y)
point = Point2D(1.0, 2.0)
Run Code Online (Sandbox Code Playgroud)
PyCharm在构造新对象时会看到类型,但是不会抓住那个点.x和point.y是浮点数,所以不会有助于检测它们的误用.而且我也不喜欢在常规基础上重新定义"魔法"方法的想法.
所以我正在寻找一些东西:
理想的解决方案可能如下所示:
class Point2D(ValueObject):
"""Class for immutable value objects""" …Run Code Online (Sandbox Code Playgroud) PyCharm类型提示很棒.我们在项目中广泛使用它.但是方法文档字符串中不时出现类型名称的拼写错误,并且错过了PyCharm在开发时可能发出警告的一些错误.
是否有可能让PyCharm警告我docstring中参数类型中的错误类型引用?例如,如果我输入错字:type num: lomg而不是:type num: long我想要lomg突出显示为警告.
我们在生产中遇到 ES 5.4.2 问题。大约 25% 的索引文档仅在索引请求成功响应 3 秒或更长时间后才会出现在搜索结果中。对于某些文档,它会超过 7 秒。我们的集群由三个具有 59GB RAM 的节点组成,其中 31GB 专用于 ES 堆。堆使用率永远不会超过 75%,GC 将其降至约 25-30%。索引速度相对较低,每秒不到 10 个文档。我们的平均刷新时间约为 300 毫秒。刷新间隔默认为 1s。
有了这些数字,我预计索引和搜索可用性之间最多有大约 1.5 秒的延迟。我在这里缺少什么?是否可以减少这种搜索可用性延迟?也许我错过了一些值得监控的指标?
我们正在运行 Azure AD B2C 对应用程序中的用户进行身份验证。我们还成功地用 Terraform 编写了几乎所有内容,并且对此非常满意。现在,我们尝试将这些清单移至 Azure Devops Pipelines 下,但遇到了访问问题。
Azure Pipelines 使用主(非 B2C)Active Directory 中的专用服务主体来执行其操作。我们在目标订阅中授予此 SP 足够的权限来处理 Terraform 资源。但我找不到任何方法来授予此 SP 对 B2C 目录的任何权限。我可以邀请主目录中的用户到 B2C,效果很好,但 SP 是一个应用程序,而不是用户。
有什么方法可以将应用程序从主目录“邀请”到B2C目录中吗?
我在Scala中有一个简单的树结构,如下所示:
sealed abstract class FactsQueryAst[FactType] {
}
object FactsQueryAst {
case class AndNode[FactType](subqueries: Seq[FactsQueryAst[FactType]]) extends FactsQueryAst[FactType]
case class OrNode[FactType](subqueries: Seq[FactsQueryAst[FactType]]) extends FactsQueryAst[FactType]
case class Condition[FactType](fact: FactType, value: FactValue) extends FactsQueryAst[FactType]
}
Run Code Online (Sandbox Code Playgroud)
是否有任何相对简单的方法可以使此结构与高阶函数(如map,foldLeft或filter)一起使用?有关于为自己的集合实现Traversable特征的好文章(http://daily-scala.blogspot.com/2010/04/creating-custom-traversable.html),但它似乎过于复杂的树案例,或者在至少我错过了一些校长.
UPD.我试图实现如下的朴素Traversable,但它只会导致无限循环打印该值.
sealed abstract class FactsQueryAst[FactType] extends Traversable[FactsQueryAst.Condition[FactType]]
object FactsQueryAst {
case class AndNode[FactType](subqueries: Seq[FactsQueryAst[FactType]]) extends FactsQueryAst[FactType] {
def foreach[U](f: (Condition[FactType]) => U) {subqueries foreach {_.foreach(f)}}
}
case class OrNode[FactType](subqueries: Seq[FactsQueryAst[FactType]]) extends FactsQueryAst[FactType] {
def foreach[U](f: (Condition[FactType]) => U) {subqueries foreach {_.foreach(f)}}
}
case class Condition[FactType](fact: FactType, …Run Code Online (Sandbox Code Playgroud)