Repository navigation
bpo-29659: Expose copyfileobj() length arg for public use
#328
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
copyfileobj length arg in shutil
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -76,10 +76,11 @@ class RegistryError(Exception): | |
| def copyfileobj(fsrc, fdst, length=None): | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. def copyfileobj(fsrc, fdst, length=16*1024):I personally prefer this way in my code to concentrate 2 lines worth of code into one. if not length:
length = 16 * 1024It looks a little nicer and not to mention saves lines of code that basically do the same thing. |
||
| """Copy data from file-like object `fsrc` to file-like object `fdst`. | ||
|
|
||
| An in-memory buffer size can be set with `length`; the default is 16 KB. | ||
| An in-memory buffer size in bytes can be set with `length`; the default is | ||
| 16 KiB. | ||
| """ | ||
| if not length: | ||
| length = 16*1024 | ||
| length = 16 * 1024 | ||
| while 1: | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure that it's ok to use a loop if the length is negative. I suggest to have a special case for negative value calling read() (no parameter) only once. |
||
| buf = fsrc.read(length) | ||
| if not buf: | ||
|
|
@@ -104,8 +105,8 @@ def copyfile(src, dst, *, follow_symlinks=True, length=None): | |
| If follow_symlinks is not set and src is a symbolic link, a new | ||
| symlink will be created instead of copying the file it points to. | ||
|
|
||
| An in memory buffer size can be set with `length`; the default is 16 kB. | ||
|
|
||
| An in-memory buffer size in bytes can be set with `length`; the default is | ||
| 16 KiB. | ||
| """ | ||
| if _samefile(src, dst): | ||
| raise SameFileError("{!r} and {!r} are the same file".format(src, dst)) | ||
|
|
@@ -242,6 +243,9 @@ def copy(src, dst, *, follow_symlinks=True, length=None): | |
| If source and destination are the same file, a SameFileError will be | ||
| raised. | ||
|
|
||
| An in-memory buffer size in bytes can be set with `length`; the default is | ||
| 16 KiB. | ||
|
|
||
| """ | ||
| if os.path.isdir(dst): | ||
| dst = os.path.join(dst, os.path.basename(src)) | ||
|
|
@@ -258,6 +262,8 @@ def copy2(src, dst, *, follow_symlinks=True, length=None): | |
| If follow_symlinks is false, symlinks won't be followed. This | ||
| resembles GNU's "cp -P src dst". | ||
|
|
||
| An in-memory buffer size in bytes can be set with `length`; the default is | ||
| 16 KiB. | ||
| """ | ||
| if os.path.isdir(dst): | ||
| dst = os.path.join(dst, os.path.basename(src)) | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"A negative length value means to copy the data without looping over the source data in chunks"
I dislike this definition. In practice, negative means "unlimited" buffer size: the whole input file is loaded into memory.
I'm not sure that it's a good practice to try to load files of unknown size into memory.
I suggest to remove this feature which seems more like a side effect than a carefully designed API.
If you want to get fast copy, pass a very large length like 1 GB. But if Python starts to load 1 TB into memory, it's likely to crash the system... At least, to slow down the system, a lot.