Skip to main content

A pure Python library to simulate Python's internal argument binding given function signature details, default values, and user-provided arguments/keywords.

Project description

simulate-argument-binding

A pure Python library to simulate Python's internal argument binding given function signature details, default values, and user-provided arguments/keywords. Useful for code analysis, code generation, and implementing custom dispatch or validation logic.

Installation

pip install simulate-argument-binding

Examples

from __future__ import print_function
from simulate_argument_binding import simulate_argument_binding

# 1. All Required Arguments Provided
binding = simulate_argument_binding(
    posonlyargs=['x'],
    args=['y'],
    vararg=None,
    kwonlyargs=['z'],
    varkwarg=None,
    defaults={},
    provided_args=[3, 4],
    provided_kwargs={'z': 5}
)
assert list(binding.items()) == [('x', 3), ('y', 4), ('z', 5)]

# 2. Default Values and Overriding
binding = simulate_argument_binding(
    posonlyargs=['a'],
    args=['b', 'c'],
    vararg=None,
    kwonlyargs=['d'],
    varkwarg=None,
    defaults={'b': 2, 'c': 3, 'd': 4},
    provided_args=[9, 8],  # a=9, b=8 overrides default
    provided_kwargs={}
)
assert list(binding.items()) == [('a', 9), ('b', 8), ('c', 3), ('d', 4)]

# 3. Var-positional (`*args`) and Var-keyword (`**kwargs`)
binding = simulate_argument_binding(
    posonlyargs=[],
    args=['x'],
    vararg='args',
    kwonlyargs=[],
    varkwarg='kwargs',
    defaults={},
    provided_args=[1, 2, 3, 4],
    provided_kwargs={'foo': 10, 'bar': 20}
)
assert list(binding.items()) == [
    ('x', 1),
    ('args', (2, 3, 4)),
    ('kwargs', {'foo': 10, 'bar': 20})
]

# 4. Keyword-only Arguments
binding = simulate_argument_binding(
    posonlyargs=[],
    args=[],
    vararg=None,
    kwonlyargs=['k1', 'k2'],
    varkwarg=None,
    defaults={'k2': 5},
    provided_args=[],
    provided_kwargs={'k1': 1}
)
assert list(binding.items()) == [
    ('k1', 1),
    ('k2', 5)
]

# 5. Detect Missing Required Arguments
try:
    simulate_argument_binding(
        posonlyargs=['a'],
        args=['b'],
        vararg=None,
        kwonlyargs=[],
        varkwarg=None,
        defaults={},
        provided_args=[],
        provided_kwargs={}
    )
except TypeError as ex:
    assert "Missing positional-only arguments" in str(ex) or "Missing arguments" in str(ex)
else:
    assert False, "Should have raised TypeError"

# 6. Detect Duplicate Assignment
try:
    simulate_argument_binding(
        posonlyargs=[],
        args=['x'],
        vararg=None,
        kwonlyargs=[],
        varkwarg=None,
        defaults={},
        provided_args=[1],
        provided_kwargs={'x': 2}
    )
except TypeError as ex:
    assert "multiple values for argument 'x'" in str(ex)
else:
    assert False, "Should have raised TypeError"

# 7. Detect Extra Positional/Keyword Args when Not Allowed
try:
    simulate_argument_binding(
        posonlyargs=[],
        args=['a'],
        vararg=None,
        kwonlyargs=[],
        varkwarg=None,
        defaults={},
        provided_args=[1, 2],
        provided_kwargs={}
    )
except TypeError as ex:
    assert "extra positional arguments" in str(ex)
else:
    assert False, "Should have raised TypeError"

try:
    simulate_argument_binding(
        posonlyargs=['a'],
        args=[],
        vararg=None,
        kwonlyargs=[],
        varkwarg=None,
        defaults={},
        provided_args=[5],
        provided_kwargs={'oops': 1}
    )
except TypeError as ex:
    assert "extra keyword arguments" in str(ex)
else:
    assert False, "Should have raised TypeError"

# 8. Advanced: Mixing All Kinds
binding = simulate_argument_binding(
    posonlyargs=['a'],
    args=['b'],
    vararg='c',
    kwonlyargs=['d'],
    varkwarg='e',
    defaults={'b': 2, 'd': 3},
    provided_args=[1, 99, 7, 8, 9],  # a=1, b=99, *c=(7,8,9)
    provided_kwargs={'d': 42, 'extra1': 'x', 'extra2': 'y'}
)
assert list(binding.items()) == [
    ('a', 1),
    ('b', 99),
    ('c', (7, 8, 9)),
    ('d', 42),
    ('e', {'extra1': 'x', 'extra2': 'y'})
]

Contributing

Contributions are welcome! Please submit pull requests or open issues on the GitHub repository.

License

This project is licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

simulate_argument_binding-0.1.0a0.tar.gz (4.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

simulate_argument_binding-0.1.0a0-py2.py3-none-any.whl (4.8 kB view details)

Uploaded Python 2Python 3

File details

Details for the file simulate_argument_binding-0.1.0a0.tar.gz.

File metadata

File hashes

Hashes for simulate_argument_binding-0.1.0a0.tar.gz
Algorithm Hash digest
SHA256 6a48adc6d53b38c2c8a9ad7961bcb4299dbe8551d3bd9cff46cbc7eb4017aaae
MD5 78bd8fe33fcf35dc1e629bdb46b46b52
BLAKE2b-256 c6c04cbf47a431b1aa3c5decbd77ca58785723f70ba42cdfedfde0248ea07d41

See more details on using hashes here.

File details

Details for the file simulate_argument_binding-0.1.0a0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for simulate_argument_binding-0.1.0a0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 f6a3b07b95929ae64e4d6166a8c766950d37812b79f5c1672be26d4d4c330e90
MD5 ccb29712bc5a55d8c6111beecef2694f
BLAKE2b-256 f986b924bb1f69ee403b27b947ea96184358588c4060b808ee21fcc9bcfff5ac

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page