Open VicGoico opened 10 months ago
Hey @VicGoico, from my point of view, this is not a bug but expected behavior. Default values should be treated as READ-Only. We cannot expect all default values to implement copy to satisfaction. Due to that, it is on the user to avoid mutating the defaults. My recommendation for lists: use an empty tuple for defaults (,)
. However, documentation could be improved to mention this.
Hi @erikwrede , thanks for your answer.
Therefore, the solution is to use .copy()
, when we want to handle the value argument, to isolate it.
To sum up, the example that I mentioned, will work fine doing this:
class AnimalFarm(graphene.Mutation):
class Arguments:
animals = graphene.List(graphene.String, default_value=(,))
output = graphene.List(graphene.String)
def mutate(root, info, **filters):
animals_mio = filters["animals"].copy() # Here is the solution
animals_mio.append('duck')
return animals_mio
class Mutation(graphene.ObjectType):
animal_farm = AnimalFarm.Field()
Any mantainer can close the issue if they see it necessary.
Thanks for your work and have a nice day
Hi,
where you can see that I am declaring a Mutation that have and argument called "animals" which type is "graphene.List(graphene.String, default_value=[])", that means if I dont pass this argument in the mutation, graphene automatically filled this argument ("animals") with an empty list.
At this point all works perfect, but when I try the following steps, I reckon that could be a little bug in to reset the old value of "animals" argument.
Step 1: Install the latest version of graphene, in a linux OS, in my case is Ubuntu 22.04.3 LTS:
Step 2: Copy this code in a file with extension ".py", for example:
Step 3: Copy this code to have the example, where you can this bug:
Step 5: Execute "n" + Enter, to check this steps that works as expected in the first request, where we can see that both variables: animals_local filters["animals"] are equal as an empty list, as you can see in this image: Now if we add a value to the variable "aniamls_local" we also see that works perfect:
Step 6: The bug appear in the second request, where we do same steps that in the Step 5, but in this second request if we check the value of varieble filters["animals"] we can see that its default value is the old value of the previous request, where we added "duck" word to "animals" list argument:
What is the expected behavior? The expected behavior is that if I launch multiple request of this mutation and I dont pass any value for "animals" argument, the default_value must be what I declare in set up type (an empty list). So graphene have to reset correctly the default_value and not persist old values.
Please tell us about your environment: