【问题标题】:How can I convert a Scala HashSet to a Python set using py4j?如何使用 py4j 将 Scala HashSet 转换为 Python 集?
【发布时间】:2020-05-17 02:23:35
【问题描述】:

我在 Scala 中有一个返回 Set[String] 的对象:

object MyObject {
  val setOfStrings = Set[String]("string1","string2")
}

我可以通过以下方式从我的 Python 代码(使用 Py4J)中成功引用该 val:

jvm.com.package.MyObject.setOfStrings()

但是我不知道如何用它做任何有用的事情。我想将其转换为 python 集。

我设法做到了:

eval(
  str(
    jvm.com.package.MyObject.setOfStrings()
  )
      .replace("Set(", "{\"")
      .replace(")", "\"}")
      .replace(", ", "\", \"")
)

但这是一种非常脆弱的实现方式,我假设 Py4J 提供了更好的方式。

我知道SetConverter 可以将python 集转换为Java 集,但我想做相反的事情。有人知道怎么做吗?

【问题讨论】:

    标签: scala py4j


    【解决方案1】:

    您可以在 Scala 端使用 java.util.Set,将 Py4J 的 will be converted 转换为 Python 等效的 MutableSet

    如果您不想在您的 Scala 代码库中使用 Java 集合,那么当您想与 Python 通信时,您可能需要将 scala.collection.immutable.Set 转换为其 Java 等效项。

    我没有运行此代码,但您可能可以这样做:

    object YourObject {
      val setOfStrings = Set[String]("string1","string2")
    }
    
    object ViewObject {
      import scala.jdk.CollectionConverters._
      def setOfStrings: java.util.Set[String] = YourObject.setOfStrings.asJava
    }
    

    并在 Python 中使用它:

    jvm.com.package.ViewObject.setOfStrings()
    

    请注意,在这种情况下,您是 won't be able to modify the collection。如果您希望能够在 Python 中更新视图并将更改反映在 Scala 中,那么您必须在 Scala 代码中使用 scala.collection.mutable.Set

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2018-12-24
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多