Two modules, both exporting the same name.

There are two packages that I want to use: CorpusLoaders.jl and WordNet.jl

  • CorpusLoaders.SemCor exports sensekey(::SenseTaggedWord)
  • Word Export sensekey(::DB, ::Synset, ::Lemma)

I want to use both methods sensekey.

For instance,

for a mixed list of items: mixedlist::Vector{Union{Tuple{SenseTaggedWord},Tuple{DB, Synset,Lemma}}. Those. the items in the list are a mixture of 1 sets SenseTaggedWordand 3 tuples DB, Synsetand Lemma.

for item in mixedlist
    println(sensekey(item...)
end

must work. This example is a bit fascinating, so why should I mix them like that. But, hopefully, this serves to illustrate the problem in the general case.

An attempt to using CorpusLoaders.SemCor, WordNetbring both results toWARNING: both WordNet and Semcor export "sensekey"; uses of it in module Main must be qualified.

Manually import both: import CorpusLoaders.SemCor.sensekey; import WordNet.sensekeyresults inWARNING: ignoring conflicting import of Semcor.sensekey into Main

? , - .


, CorpusLoaders.jl - , , , CorpusLoaders.jl WordNet.jl. , , CorpusLoaders.jl

 import WordNet
 function WordNet.sensekey(s::SenseTaggedWord)...

. WordNet CorpusLoaders.

, - .

+3
3

, . , , , , . sensekey .

- sensekey, , :

sensekey(x) = CorpusLoaders.sensekey(x)
sensekey(x, y, z) = WordNet.sensekey(x,y,z)
+6

, @Fengyang Wang, :

function importfrom(moduleinstance::Module, functionname::Symbol, argtypes::Tuple)
    meths = methods(moduleinstance.(functionname), argtypes)
    importfrom(moduleinstance, functionname, meths)
end 

function importfrom(moduleinstance::Module, functionname::Symbol)
    meths = methods(moduleinstance.(functionname))
    importfrom(moduleinstance, functionname, meths)
end 

function importfrom(moduleinstance::Module, functionname::Symbol, meths::Base.MethodList)
    for mt in meths
        paramnames = collect(mt.lambda_template.slotnames[2:end])
        paramtypes = collect(mt.sig.parameters[2:end])
        paramsig = ((n,t)->Expr(:(::),n,t)).(paramnames, paramtypes)

        funcdec = Expr(:(=), 
                        Expr(:call, functionname, paramsig...),
                        Expr(:call, :($moduleinstance.$functionname), paramnames...)
        )
        current_module().eval(funcdec) #Runs at global scope, from calling module

    end
end

:

using WordNet
using CorpusLoaders.Semcor

importfrom(CorpusLoaders.Semcor, :sensekey)
importfrom(WordNet, :sensekey)

methods(sensekey)

2 functionkey:

  • sensekey (db:: WordNet.DB, ss:: WordNet.Synset, lem:: WordNet.Lemma)
  • sensekey (saword:: CorpusLoaders.Semcor.SenseAnnotatedWord

, DocString.

+5

tl; dr script , .. CorpusLoader.sensekey() WordNet.sensekey()


( ) :

  • CorpusLoaders.jl, sensekey(::SenseTaggedWord)
  • WordNet.jl, sensekey(::DB, ::Synset, ::Lemma)
  • script, .

, using "" / script,

  • CorpusLoaders
  • script, , ?

, , using import . .

, :

  • , . , : , "" , . CorpusLoaders.sensekey(::SenseTaggedWord).

  • using CorpusLoaders, , julia, " , Main". , , sensekey Main CorpusLoaders.sensekey(), , .

using WordNet, julia , :

" . , ( , , ). , , , ".

, 2. :

  • using CorpusLoaders;
    using WordNet;
    

    , , , CorpusLoaders.sensekey() WordNet.sensekey() , script,

  • ,

    import CorpusLoaders;
    import WordNet;
    

    ,

  • , , , , - FengYang :

     import CorpusLoaders;
     import WordNet;
     sensekey(a::SenseTaggedWord) = CorpusLoader.sensekey(a);
     sensekey(a::DB, b::Synset, c::Lemma) = WordNet.sensekey(a, b, c);
    

    , Main, , .

, using vs import .:)


, CorpusLoader WordNet. julia - python import numpy as np, , . , :
import CorpusLoaders; const cl = CorpusLoaders;
import Wordnet;       const wn = WordNet;
# ... code using both cl.sensekey() and wn.sensekey()
+5

Source: https://habr.com/ru/post/1675491/


All Articles