【问题标题】:Rewrite Python dict to Scala multimap (Porting code)?将 Python dict 重写为 Scala multimap(移植代码)?
【发布时间】:2014-12-21 07:21:43
【问题描述】:

我正在尝试将 python 库重写为 Scala 以更好地兼容新项目。 Python 版本有一些基于 dict 的 inMemoryStorage

class InMemoryStorage(BaseStorage):
  def __init__(self, config):
    self.name = 'dict'
    self.storage = dict()

  def keys(self):
    return self.storage.keys()

  def set_val(self, key, val):
    self.storage[key] = val

  def get_val(self, key):
    return self.storage[key]

  def append_val(self, key, val):
    self.storage.setdefault(key, []).append(val)

  def get_list(self, key):
    return self.storage.get(key, [])

我的 scala 版本还不是很完善,但我不确定要改进它,因为我是 scala 的新手,移植它变得非常困难。我错过了什么?这是一个足够接近的重写吗?

class Storage {
  val internalStorage=new HashMap[String, Set[String]] with MultiMap[String, String]

  def keys():Iterable[String]={
    internalStorage.keys
  }

  def set_val(key:String,value:String)={
    internalStorage.addBinding(key,value)
  }

  def get_val( key:String):Set[String]= {
    return internalStorage(key)
  }

  def append_val( key:String, value:String)={
    internalStorage.addBinding(key,value)
  }

  def get_list(key:String):Set[String]={
    internalStorage(key)
  }
}

【问题讨论】:

  • 你不需要那么多牙套。一般来说,最好尝试采用惯用的 scala 样式 - 编写“python in scala”将不合适。所以你可能想考虑例如在get_list 中使用internalStorage.get(返回Option,强制您处理故障情况),并实现提供存储接口的trait
  • 对不起,我不太清楚你的意思,你能给我举个这个特征的例子吗?

标签: python scala dictionary porting multimap


【解决方案1】:

你在正确的轨道上,set_val 需要覆盖初始的(key, value)(如果存在)并重新开始(从 python 代码中可以看出):

def set_val(key:String,value:String)={
  if (internalStorage.contains(key)) 
    internalStorage.remove(key); // to start fresh
  internalStorage.addBinding(key,value)
}

此外,由于仅使用存储访问 internalStorage,您可能希望将其设为 private

private[this] val internalStorage=new HashMap[String, Set[String]] with MultiMap[String, String]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2012-11-16
    相关资源
    最近更新 更多