Extract method/variable and introduce parameter don't check whether the new name is already in use
Mantenedores costumam responder em até 7 dias
@aliassar já está trabalhando nisso.
Desde 4/11/2026.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 62/100
Direção de pesquisa
Start with the entry points in the reproduction: extract.ExtractMethod, extract.ExtractVariable, introduce_parameter.IntroduceParameter and MethodObject.get_changes. Use the name-clash checks that rename already performs (the #761 to #769 fixes) as the reference for the error to raise. Done means each of the three reproductions raises RefactoringError instead of producing changed or broken output, and the existing refactoring tests still pass.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Extract method, extract variable and introduce parameter accept a new name that is already in use in the target scope. The result either doesn't run, or runs and silently changes behaviour. Rename already refuses several kinds of clashing names (#761 to #766, #768 and #769 were fixed that way, and #779 asks for the general check), so the other refactorings that introduce a name should do the same.
To Reproduce
import pathlib
import tempfile
from rope.base.project import Project
from rope.refactor import extract, introduce_parameter
def run(source, make):
root = pathlib.Path(tempfile.mkdtemp())
(root / "m.py").write_text(source)
project = Project(str(root), ropefolder=None)
changes = make(project, project.get_resource("m.py"), source)
print(changes.changes[0].new_contents)
# 1. Extract method into the name of an existing function
run(
"def helper():\n return 42\n\ndef f(a):\n return a + 1\n\nprint(helper())\n",
lambda p, r, s: extract.ExtractMethod(
p, r, s.index("a + 1"), s.index("a + 1") + 5
).get_changes("helper"),
)
# 2. Extract variable into the name of an existing parameter
run(
"def f(a, b):\n c = a * 2\n return c + b\n",
lambda p, r, s: extract.ExtractVariable(
p, r, s.index("a * 2"), s.index("a * 2") + 5
).get_changes("b"),
)
# 3. Introduce parameter with the name of an existing parameter
run(
"def f(a):\n return a + LIMIT\n\nLIMIT = 3\n",
lambda p, r, s: introduce_parameter.IntroduceParameter(
p, r, s.index("LIMIT")
).get_changes("a"),
)
Output on master (46ebf37), Python 3.13:
# 1. The second definition replaces the first one; print(helper()) now raises TypeError
def helper():
return 42
def f(a):
return helper(a)
def helper(a):
return a + 1
print(helper())
# 2. The parameter b is overwritten, so f(1, 10) returns 4 instead of 12
def f(a, b):
b = a * 2
c = b
return c + b
# 3. SyntaxError: duplicate argument 'a'
def f(a, a=LIMIT):
return a + a
LIMIT = 3
MethodObject.get_changes(classname) behaves the same way: with an existing class NewMethodObject, it adds a second class of that name.
Expected behaviour
Raise RefactoringError when the new name is already defined in the scope where the refactoring introduces it, or in a scope where the new definition would shadow it, as rename does for the cases fixed in #761 to #766, #768 and #769.
Editor information
- Python 3.13
- Rope master 46ebf37 (also 1.14.0)
- Found while adding Rope refactorings to rope-language-server. A language server can't prompt for a name before running the refactoring, so it has to choose one, and it can't rely on Rope to reject a clash.
- Linguagem predominante
- Python
- Estrelas
- 2.2k
- Forks
- 197
- Merge médio
- 2d 13h
- PRs com merge (30d)
- 5
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de python-rope/rope
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 88/100
python-rope/rope#927 ·
Mantenedores costumam responder em até 7 dias
-
Extract raises IndexError or ModuleSyntaxError instead of RefactoringError for an empty or whitespace-only regionTalvez já em andamento @aliassar assumiu há 1 dia. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
python-rope/rope#926 ·
Mantenedores costumam responder em até 7 dias
-
simplify.real_code blanks t-strings, so renames inside them edit the wrong offsetTalvez já em andamento @sean0407 assumiu há 11 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
python-rope/rope#913 ·
Mantenedores costumam responder em até 7 dias
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 30/100
python-rope/rope#925 ·
Mantenedores costumam responder em até 7 dias
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
python-rope/rope#923 ·
Mantenedores costumam responder em até 7 dias
Todas as issues de python-rope/rope
Issues semelhantes
-
needs-area-label
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
Mantenedores costumam responder em até 2 dias
-
enhancement good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Official-Space-AI/OpenPhysGraspGen#114 ·
Mantenedores costumam responder em até 2 dias
-
changelog investigate
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
ramnes/notion-sdk-py#441 ·
-
qa_bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
NVIDIA-NeMo/Gym#5644 ·
Mantenedores costumam responder em até 2 dias
-
BUG: catalog database credentials printed to logs at startupTalvez já em andamento @cjboyle assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
Mantenedores costumam responder em até 1 dia