Support `exist_ok` for `pathlib`'s `Path.copy_into()`
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
Background
The Path.copy_into() method (introduced in Python 3.14) is used to copy files or directories into another directory.
The behaviour of files being copied and directories being copied is inconsistent when the destination directory contains a file or directory with the same name.
Examples
When a file is copied into a directory that already has a file with that name, the copied file overwrites the file at the destination directory:
"""
# Copying a file into a directory that already has a file with the same name #
Directory Structure:
dir_a
|__my_file.txt
dir_b
|__my_file.txt
"""
from pathlib import Path
dir_a_my_file = Path("dir_a") / "my_file.txt"
dir_b = Path("dir_b")
# Act
dir_a_my_file.copy_into(dir_b) # Success - dir_a/my_file.txt overwrites dir_b/my_file.txt
However, when a directory is copied into another directory (one which contains a sub-directory with the same name),
the copy operation fails and FileExistsError is raised:
"""
# Copying a directory into a directory, that contains a sub-directory with the same name #
Directory Structure:
dir_a
|__my_dir
dir_b
|__my_dir
"""
from pathlib import Path
dir_a_my_dir = Path("dir_a") / "my_dir"
dir_b = Path("dir_b")
# Act
dir_a_my_dir.copy_into(dir_b) # Failure - FileExistsError is raised.
Problem
The behaviour of the copy_into() method in the file case (success) and in the directory case (failure) is inconsistent.
It is also inconsistent with how Linux (when using cp -r) handles this exact same case.
Expected Result
Instead of raising an exception, the copied directory should be merged with the existing one.
Fix Suggestion
-
Add a default
exist_ok=Trueparameter tocopy_into().
This parameter is already used in thePath.touch()andPath.mkdir()methods, and should be familiar to users. -
When a file is copied into a destination directory that already has a file with the same name:
-
If
exist_ok=True, the copied file should overwrite the file at the destination directory.
This is the already the current behaviour, so no additional changes are required. -
If
exist_ok=False, aFileExistsErrorexception will be raised. This is consistent with the behaviour ofPath.touch().
-
-
When a directory is copied into a destination directory that contains a sub-directory with the same name:
- If
exist_ok=True, the copied directory will be merged with the destination's sub-directory.
This is consistent with the behaviour of copying in Linux. - If
exist_ok=False, aFileExistsErrorexception will be raised. This is consistent with the behaviour ofPath.mkdir().
- If
Thank you.
CPython versions tested on:
3.14
Operating systems tested on:
Linux
Linked PRs
- gh-143058
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par localiser l’implémentation de pathlib et les tests de Path.copy_into(), puis comparez son comportement actuel en cas de collision de fichiers et de répertoires avec celui de Path.touch() et Path.mkdir(). Le travail est terminé lorsque exist_ok est pris en charge, que les copies récursives de répertoires sont fusionnées ou lèvent une exception comme spécifié, et que les deux cas sont couverts par des tests ; notez que la PR liée gh-143058 indique déjà que le travail est en cours.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- operating-systems
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 25/100