Unlike Solidity, where forgetting a visibility keyword silently defaults to `public`, Vyper simply refuses to compile a function without `@external` or `@internal`. This single rule has eliminated an entire historical class of Solidity bugs (accidentally public functions).
@external
def withdraw(amount: uint256):
assert msg.sender == self.owner, "not owner"
send(self.owner, amount)You can stack multiple decorators on one function, e.g. `@external` with `@view`, `@payable`, or `@nonreentrant("lock")`, but the visibility decorator is always mandatory.