[Tutor] Feed arguments to callback(?) function

trent shipley trent.shipley at gmail.com
Wed Jun 7 14:09:15 EDT 2023


Yes that was exactly it.  Another problem is that Python doesn't like you
trying to pass in arbitrary keyword arguments instead because it could
result in a name collision, so using *args is preferred.

I found this to be very helpful:
https://www.informit.com/articles/article.aspx?p=3145749&seqNum=16

On Tue, Jun 6, 2023 at 4:19 AM Sarfraaz Ahmed <sarfraaz at gmail.com> wrote:

> 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