AGENT SKILL

python-to-scala-translation-patterns

Use when translating Python OOP/functional code to idiomatic Scala 2.13, covering class hierarchies, enumerations, error handling, and naming conventions

License 许可
MIT
最近更新
2026-10-02
Stars
★ 92
Forks
7

01 前言 Front Matter

name
python-to-scala-translation-patterns
description
Use when translating Python OOP/functional code to idiomatic Scala 2.13, covering class hierarchies, enumerations, error handling, and naming conventions

03 SKILL.md 正文

Python to Scala Translation Patterns

Class and Object Hierarchy

Enumerations

Python Enum → Scala sealed trait + case object:

// Python
class TokenType(Enum):
    STRING = "string"
    NUMERIC = "numeric"

// Scala
sealed trait TokenType
object TokenType {
  case object String  extends TokenType
  case object Numeric extends TokenType
  // companion object provides namespace
}

Abstract Base Classes

Python ABC / abstract methods → Scala abstract class or trait:

// Python
class BaseTokenizer(ABC):
    @abstractmethod
    def tokenize(self, text: str) -> List[Token]: ...

// Scala
abstract class BaseTokenizer {
  def tokenize(text: String): List[Token]
}
// OR as a trait (preferred for mixin composition)
trait BaseTokenizer {
  def tokenize(text: String): List[Token]
}

Data Classes / Named Tuples

Python @dataclass / NamedTuple → Scala case class:

// Python
@dataclass
class Token:
    value: str
    token_type: TokenType
    metadata: dict = field(default_factory=dict)

// Scala
case class Token(
  value: String,
  tokenType: TokenType,
  metadata: Map[String, Any] = Map.empty
)

Naming Conventions

Concept Python Scala
Class PascalCase PascalCase
Method/field snake_case camelCase
Constant UPPER_SNAKE UpperCamelCase or camelCase val
Package lowercase lowercase
Type param T T
// Python: token_type, is_valid, to_token
// Scala: tokenType, isValid, toToken

Optional / None Handling

Python Optional[T] / None → Scala Option[T]:

// Python
def find(text: str) -> Optional[Token]:
    if condition: return Token(...)
    return None

// Scala
def find(text: String): Option[Token] =
  if (condition) Some(Token(...)) else None

Error Handling

Python try/except with custom exceptions → Scala Try, Either, or Option:

import scala.util.{Try, Success, Failure}

// Python
try:
    result = risky()
except ValueError as e:
    return None

// Scala — Try
def risky(): Try[Token] = Try { /* may throw */ }

// Scala — Either for typed errors
def parse(s: String): Either[String, Token] =
  if (valid(s)) Right(Token(s, ...))
  else Left(s"Invalid input: $s")

Collections

Python Scala
list List[T] or Seq[T]
dict Map[K, V]
set Set[T]
tuple (A, B) or case class
List[str] List[String]
Dict[str, Any] Map[String, Any]
// Python: [t for t in tokens if t.value != ""]
// Scala:
tokens.filter(_.value.nonEmpty)

// Python: [f(x) for x in xs]
// Scala:
xs.map(f)

// Python: sum(len(t.value) for t in tokens)
// Scala:
tokens.map(_.value.length).sum

Companion Objects (replacing Python class methods / static methods)

// Python @classmethod or @staticmethod
class Token:
    @staticmethod
    def from_string(s: str) -> Token: ...

// Scala companion object
case class Token(value: String, tokenType: TokenType)
object Token {
  def fromString(s: String): Token = ...
}

Pattern Matching (replaces isinstance / match)

// Python
if isinstance(x, StringTokenizer): ...
elif isinstance(x, NumericTokenizer): ...

// Scala
x match {
  case _: StringTokenizer  => ...
  case _: NumericTokenizer => ...
}

// On sealed traits
tokenType match {
  case TokenType.String  => ...
  case TokenType.Numeric => ...
}

Default Parameters and Named Arguments

// Python
def tokenize(text: str, lower: bool = True) -> List[Token]: ...
tokenize("Hello", lower=False)

// Scala
def tokenize(text: String, lower: Boolean = true): List[Token] = ...
tokenize("Hello", lower = false)

04 同仓库更多 Skills