From cd01bc11e991b5818a9d867ba351a5fcb5b47182 Mon Sep 17 00:00:00 2001 From: Simeon Schaub Date: Tue, 13 Apr 2021 23:27:40 +0200 Subject: [PATCH 1/2] deprecate `getproperty(::Pairs, s)` --- base/accumulate.jl | 12 ++++++------ base/deprecated.jl | 7 +++++++ base/iterators.jl | 28 +++++++++++++-------------- base/namedtuple.jl | 2 +- base/reduce.jl | 2 +- stdlib/InteractiveUtils/src/macros.jl | 2 +- test/syntax.jl | 2 +- 7 files changed, 31 insertions(+), 24 deletions(-) diff --git a/base/accumulate.jl b/base/accumulate.jl index f90f85b315d7c..e8bfda486f51f 100644 --- a/base/accumulate.jl +++ b/base/accumulate.jl @@ -291,10 +291,10 @@ function accumulate(op, A; dims::Union{Nothing,Integer}=nothing, kw...) # This branch takes care of the cases not handled by `_accumulate!`. return collect(Iterators.accumulate(op, A; kw...)) end - nt = kw.data - if nt isa NamedTuple{()} + nt = values(kw) + if isempty(kw) out = similar(A, promote_op(op, eltype(A), eltype(A))) - elseif nt isa NamedTuple{(:init,)} + elseif keys(nt) === (:init,) out = similar(A, promote_op(op, typeof(nt.init), eltype(A))) else throw(ArgumentError("acccumulate does not support the keyword arguments $(setdiff(keys(nt), (:init,)))")) @@ -354,10 +354,10 @@ julia> B ``` """ function accumulate!(op, B, A; dims::Union{Integer, Nothing} = nothing, kw...) - nt = kw.data - if nt isa NamedTuple{()} + nt = values(kw) + if isempty(kw) _accumulate!(op, B, A, dims, nothing) - elseif nt isa NamedTuple{(:init,)} + elseif keys(kw) === (:init,) _accumulate!(op, B, A, dims, Some(nt.init)) else throw(ArgumentError("acccumulate! does not support the keyword arguments $(setdiff(keys(nt), (:init,)))")) diff --git a/base/deprecated.jl b/base/deprecated.jl index 45adac55a355c..32fcdce3ba55b 100644 --- a/base/deprecated.jl +++ b/base/deprecated.jl @@ -239,3 +239,10 @@ end cat_shape(dims, shape::Tuple{}) = () # make sure `cat_shape(dims, ())` do not recursively calls itself # END 1.6 deprecations + +# BEGIN 1.7 deprecations + +# the plan is to eventually overload getproperty to access entries of the dict +@deprecate getproperty(x::Pairs, s::Symbol) getfield(x, s) + +# END 1.7 deprecations diff --git a/base/iterators.jl b/base/iterators.jl index 2eb944c929b64..48557e66dd2f3 100644 --- a/base/iterators.jl +++ b/base/iterators.jl @@ -235,30 +235,30 @@ pairs(A::AbstractArray) = pairs(IndexCartesian(), A) pairs(A::AbstractVector) = pairs(IndexLinear(), A) # pairs(v::Pairs) = v # listed for reference, but already defined from being an AbstractDict -length(v::Pairs) = length(v.itr) -axes(v::Pairs) = axes(v.itr) -size(v::Pairs) = size(v.itr) +length(v::Pairs) = length(getfield(v, :itr)) +axes(v::Pairs) = axes(getfield(v, :itr)) +size(v::Pairs) = size(getfield(v, :itr)) @propagate_inbounds function iterate(v::Pairs{K, V}, state...) where {K, V} - x = iterate(v.itr, state...) + x = iterate(getfield(v, :itr), state...) x === nothing && return x indx, n = x - item = v.data[indx] + item = getfield(v, :data)[indx] return (Pair{K, V}(indx, item), n) end -@inline isdone(v::Pairs, state...) = isdone(v.itr, state...) +@inline isdone(v::Pairs, state...) = isdone(getfield(v, :itr), state...) IteratorSize(::Type{<:Pairs{<:Any, <:Any, I}}) where {I} = IteratorSize(I) IteratorSize(::Type{<:Pairs{<:Any, <:Any, <:Base.AbstractUnitRange, <:Tuple}}) = HasLength() -reverse(v::Pairs) = Pairs(v.data, reverse(v.itr)) +reverse(v::Pairs) = Pairs(getfield(v, :data), reverse(getfield(v, :itr))) -haskey(v::Pairs, key) = (key in v.itr) -keys(v::Pairs) = v.itr -values(v::Pairs) = v.data # TODO: this should be a view of data subset by itr -getindex(v::Pairs, key) = v.data[key] -setindex!(v::Pairs, value, key) = (v.data[key] = value; v) -get(v::Pairs, key, default) = get(v.data, key, default) -get(f::Base.Callable, v::Pairs, key) = get(f, v.data, key) +haskey(v::Pairs, key) = (key in getfield(v, :itr)) +keys(v::Pairs) = getfield(v, :itr) +values(v::Pairs) = getfield(v, :data) # TODO: this should be a view of data subset by itr +getindex(v::Pairs, key) = getfield(v, :data)[key] +setindex!(v::Pairs, value, key) = (getfield(v, :data)[key] = value; v) +get(v::Pairs, key, default) = get(getfield(v, :data), key, default) +get(f::Base.Callable, v::Pairs, key) = get(f, getfield(v, :data), key) # zip diff --git a/base/namedtuple.jl b/base/namedtuple.jl index ff554cae39336..9361fde52619b 100644 --- a/base/namedtuple.jl +++ b/base/namedtuple.jl @@ -267,7 +267,7 @@ merge(a::NamedTuple, b::NamedTuple{()}) = a merge(a::NamedTuple{()}, b::NamedTuple{()}) = a merge(a::NamedTuple{()}, b::NamedTuple) = b -merge(a::NamedTuple, b::Iterators.Pairs{<:Any,<:Any,<:Any,<:NamedTuple}) = merge(a, b.data) +merge(a::NamedTuple, b::Iterators.Pairs{<:Any,<:Any,<:Any,<:NamedTuple}) = merge(a, getfield(b, :data)) merge(a::NamedTuple, b::Iterators.Zip{<:Tuple{Any,Any}}) = merge(a, NamedTuple{Tuple(b.is[1])}(b.is[2])) diff --git a/base/reduce.jl b/base/reduce.jl index 66fb9bd45de87..c22924dee2396 100644 --- a/base/reduce.jl +++ b/base/reduce.jl @@ -529,7 +529,7 @@ julia> sum(1:20; init = 0.0) """ sum(a; kw...) = sum(identity, a; kw...) sum(a::AbstractArray{Bool}; kw...) = - kw.data === NamedTuple() ? count(a) : reduce(add_sum, a; kw...) + isempty(kw) ? count(a) : reduce(add_sum, a; kw...) ## prod """ diff --git a/stdlib/InteractiveUtils/src/macros.jl b/stdlib/InteractiveUtils/src/macros.jl index 011a0034378b2..491b7ff1a586a 100644 --- a/stdlib/InteractiveUtils/src/macros.jl +++ b/stdlib/InteractiveUtils/src/macros.jl @@ -4,7 +4,7 @@ import Base: typesof, insert! -separate_kwargs(args...; kwargs...) = (args, kwargs.data) +separate_kwargs(args...; kwargs...) = (args, values(kwargs)) """ Transform a dot expression into one where each argument has been replaced by a diff --git a/test/syntax.jl b/test/syntax.jl index 6c2cfb465abd1..1e314405442db 100644 --- a/test/syntax.jl +++ b/test/syntax.jl @@ -1863,7 +1863,7 @@ end @test_throws UndefVarError eval(:(1+$(Symbol("")))) # issue #31404 -f31404(a, b; kws...) = (a, b, kws.data) +f31404(a, b; kws...) = (a, b, values(kws)) @test f31404(+, (Type{T} where T,); optimize=false) === (+, (Type,), (optimize=false,)) # issue #28992 From 7fc9b599b98bec9d265037ff7332c5756c4d1bd0 Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Fri, 16 Apr 2021 16:45:04 -0400 Subject: [PATCH 2/2] Update base/deprecated.jl --- base/deprecated.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/base/deprecated.jl b/base/deprecated.jl index 32fcdce3ba55b..beff030f8841c 100644 --- a/base/deprecated.jl +++ b/base/deprecated.jl @@ -243,6 +243,9 @@ cat_shape(dims, shape::Tuple{}) = () # make sure `cat_shape(dims, ())` do not re # BEGIN 1.7 deprecations # the plan is to eventually overload getproperty to access entries of the dict -@deprecate getproperty(x::Pairs, s::Symbol) getfield(x, s) +@noinline function getproperty(x::Pairs, s::Symbol) + depwarn("use values(kwargs) and keys(kwargs) instead of kwargs.data and kwargs.itr", :getproperty, force=true) + return getfield(x, s) +end # END 1.7 deprecations