Beyond calling other contracts, you can declare that your own contract implements a given interface using `implements: InterfaceName`. The compiler then checks at compile time that every required function is present with a matching signature.
from vyper.interfaces import ERC20
implements: ERC20
@external
def transfer(to: address, amount: uint256) -> bool:
...This turns a documentation promise ('this is an ERC-20') into a compiler-enforced guarantee, catching missing or mis-signatured functions before deployment.