Vyper theorytheory 0/50 · 0%
Functions · medium

28. Internal helper functions

Factoring shared logic without inheritance.

Since Vyper has no inheritance, code reuse within a contract happens through `@internal` helper functions rather than base contracts. This keeps every contract self-contained and readable without following a chain of `is` relationships.

@internal
def _safe_transfer(token: address, to: address, amount: uint256):
    success: bool = ERC20(token).transfer(to, amount)
    assert success, "transfer failed"

@external
def payout(token: address, to: address, amount: uint256):
    self._safe_transfer(token, to, amount)

Internal functions can call other internal functions, take any type Vyper supports, and are inlined-away at the bytecode level with no runtime dispatch overhead compared to an external call.

Check your understanding

  1. 1. How does Vyper achieve code reuse without inheritance?

  2. 2. Can internal functions call other internal functions?

  3. 3. Why does Vyper avoid inheritance?