fix bug when iterate in locals_var.items() in python3 #17948
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
for the codes in python/paddle/fluid/layers/ops.py, in several functions as following. It will lead to a mistake when run in python3 because locals_var.items() is of type dict_items, which can't be modified during iteration. But the code like "kwargs[name] = val" in the for loop will change locals() and lead to change in locals_var.items(). To solve this problem, just use locals_var = locals().copy() instead.
def hard_shrink(x, threshold=None):
locals_var = locals()
kwargs = dict()
for name, val in locals_var.items():
if val is not None:
kwargs[name] = val
return hard_shrink(**kwargs)