[Tutor] Feed arguments to callback(?) function
Sarfraaz Ahmed
sarfraaz at gmail.com
Tue Jun 6 07:18:58 EDT 2023
I think you have to unpack the dictionary using ** while passing it as a
bunch of arguments to the transform function
roll = self._die(**self._die_args) # added **
On Tue, Jun 6, 2023 at 1:35 PM trent shipley <trent.shipley at gmail.com>
wrote:
> I want to take and arbitrary probability distribution function, send it
> it's keyword arguments, and run it as the core of a generic dice rolling
> program in Python (so it is accessible to the maximum number of
> programmers),
>
>
> # hackable_dice_roller
> # from typing import Any, List, Tuple, Callable
> from random import normalvariate, randrange, seed
> # import operator
>
>
> class DieRoll:
> def __init__(self,
> die, # a probability input function
> transform=None, # a function to transform the result
> returned by the PDF
> **die_args): # Keyword:Value arguments to the PDF python
> function (doesn't work)
> self._die = die
> self._transform = transform
> self._die_args = die_args
>
> def die_roll(self):
> roll = self._die(self._die_args) # throws error
> if self._transform is not None:
> roll = self._transform(roll)
> return roll
>
>
> class IntegerDieRoll(DieRoll):
> def __init__(self,
> transform=None,
> sides=6,
> bottom=1):
> super().__init__(die=randrange, # a random module pdf
> transform=transform,
> start=bottom, # say 1 on a 6 sided die
> stop=bottom + sides, # 1 + 6 = 7, randrange
> should return value 1 to 6 inclusive
> step=1)
> if sides <= 0:
> raise ValueError("Parameter 'die' must be at least 1")
>
> def die_roll(self):
> return int(super().die_roll())
>
> if __name__ == '__main__':
> seed(0)
>
> integer_die_roll = IntegerDieRoll()
> print(integer_die_roll.die_roll())
>
> ----------
>
> Traceback (most recent call last):
> File "/usr/lib/python3.11/random.py", line 295, in randrange
> istart = _index(start)
> ^^^^^^^^^^^^^
> TypeError: 'dict_values' object cannot be interpreted as an integer
>
> During handling of the above exception, another exception occurred:
>
> Traceback (most recent call last):
> File
> "/home/trent/pythonworkspace/hackable_dice_roller/roll_instruction.py",
> line 85, in <module>
> print(integer_die_roll.die_roll())
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File
> "/home/trent/pythonworkspace/hackable_dice_roller/roll_instruction.py",
> line 41, in die_roll
> return int(super().die_roll())
> ^^^^^^^^^^^^^^^^^^
> File
> "/home/trent/pythonworkspace/hackable_dice_roller/roll_instruction.py",
> line 21, in die_roll
> roll = self._die(self._die_args.values())
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/usr/lib/python3.11/random.py", line 297, in randrange
> istart = int(start)
> ^^^^^^^^^^
> TypeError: int() argument must be a string, a bytes-like object or a real
> number, not 'dict_values'
>
> Process finished with exit code 1
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
--
Jazaak Allahu Khair
-- Sarfraaz Ahmed
More information about the Tutor
mailing list