An input grammar states which textual forms a field accepts before numeric conversion or domain validation runs.
Python input exercise: accept an explicit integer grammar
Operation contract
The receipt wire field accepts one to eight ASCII decimal digits and a positive result. It rejects a leading plus sign, surrounding whitespace, zero and non-ASCII decimal glyphs. Python int accepts some forms that this wire format intentionally excludes; relying on conversion alone would implement a broader grammar than the API promises.
Failure and ownership boundary
The parser has a small input cap and separates textual shape from numeric positivity. Changing that grammar is an API change, not merely a display improvement. Python functions: define units, validate input and return a result and Python Decimal money: parse decimal text and choose rounding explicitly handle different input models; do not mix their accepted representations accidentally.
Working program
def wire_amount(text):
if not 1 <= len(text) <= 8 or any(character not in "0123456789" for character in text):
raise ValueError("ASCII digit field required")
amount = int(text)
if amount == 0:
raise ValueError("positive amount required")
return amount
print(wire_amount("125"))
for text in ["+125", " 125", "0", "125"]:
try:
wire_amount(text)
except ValueError:
print("field rejected")Output
125
field rejected
field rejected
field rejected
field rejectedCosts and limits
The declared eight-character cap bounds parsing work and integer size. This grammar does not identify a currency, user or authorized receipt operation.
Common Mistakes
- Conversion accepts more than every narrow wire grammar.
- Validate textual shape and domain range separately.
Connected lessons
Python functions: define units, validate input and return a result, Python Decimal money: parse decimal text and choose rounding explicitly, Python JSON validation: reject duplicate members and non-integer amounts.
