Can't overwrite some methods in 0.5.0

118 views
Skip to first unread message

Alex Mellnik

unread,
Oct 19, 2016, 7:26:30 PM10/19/16
to julia-users
Here's my bizarre find of the day.  Most functions can be overwritten without problems:

function add7(i)
    7 + i
end
Out[1]:
add7 (generic function with 1 method)
In [2]:

add7(0)
add7(0)
Out[2]:
7
In [3]:

function add7(i)
    9 + i
end
function add7(i)
    9 + i
end
Out[3]:
add7 (generic function with 1 method)
WARNING: Method definition add7(Any) in module Main at In[1]:2 overwritten at In[3]:2.
In [4]:

add7(0)
Out[4]:
9

However, others can not:

using DataFrames
df = DataFrame(A=[1,2,3], B=["A", "B", "C"])
println(df)
3×2 DataFrames.DataFrame
│ Row │ A │ B   │
├─────┼───┼─────┤
│ 1   │ 1 │ "A" │
│ 2   │ 2 │ "B" │
│ 3   │ 3 │ "C" │
In [3]:

row[:A] > 2
function filter(row)
    if row[:A] > 2
        return 1
    else
        return 3
    end
end  
Out[3]:
filter (generic function with 1 method)
In [4]:

[filter(row) for row in eachrow(df)]
[filter(row) for row in eachrow(df)]
Out[4]:
3-element Array{Int64,1}:
 3
 3
 1
In [5]:

rand() > 0.5
function filter(row)
    if row[:A] > 2
        return 2
    else
        return 4
    end
end  
WARNING: Method definition filter(Any) in module Main at In[3]:2 overwritten at In[5]:2
Out[5]:
filter (generic function with 1 method)
.
In [6]:

[filter(row) for row in eachrow(df)]
Out[6]:
3-element Array{Int64,1}:
 3
 3
 1

What is it about this second example that prevents the newer method from being used?

Yichao Yu

unread,
Oct 19, 2016, 7:41:30 PM10/19/16
to Julia Users

Nothing about it but how you use it. It's inlined to the comprehension.

Alex Mellnik

unread,
Oct 19, 2016, 10:34:00 PM10/19/16
to julia-users
Yichao,

I'm afraid I'm not following -- could you expand on that a bit?  Thanks,

Alex

Yichao Yu

unread,
Oct 20, 2016, 2:59:08 AM10/20/16
to Julia Users
On Wed, Oct 19, 2016 at 10:33 PM, Alex Mellnik <a.r.m...@gmail.com> wrote:
Yichao,

I'm afraid I'm not following -- could you expand on that a bit?  Thanks,

Andre Bieler

unread,
Oct 20, 2016, 5:41:16 AM10/20/16
to julia-users
I guess I have a similar problem, when using Optim.jl in a IJulia notebook

using Optim

function myfunc(a)
    println("Hey")
    return abs(a)
end


x0 = [1.,2.,3.]
res = optimize(myfunc, x0, iterations=20, method=BFGS())


Now when I redefine myfun() the changes do not propagate through to the optimize() call somehow, still using the initial definition.
(I tried with replacing "Hey" with "Ho", still printing "Hey")

What is the recommended way of dealing with this? I really want to redefine myfunc to see how it affects the optimization.

Andre Bieler

unread,
Oct 20, 2016, 5:42:48 AM10/20/16
to julia-users
myfunc should return sum(abs(a)) to make actual sense, but this does not matter for the problem I have

Kristoffer Carlsson

unread,
Oct 20, 2016, 7:18:45 AM10/20/16
to julia-users
myfunc = a -> begin
    println
("Hey")
   
return sum(a)
end

Alex Mellnik

unread,
Oct 20, 2016, 11:25:08 AM10/20/16
to julia-users
Thanks, after seeing https://github.com/JuliaLang/julia/issues/265#issuecomment-243056854 I have a better idea of what's going on and why it doesn't occur in 0.5.  
Reply all
Reply to author
Forward
0 new messages