[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