我要使用两个软件包:CorpusLoaders.jlWordNet.jl


CorpusLoaders.SemCor出口sensekey(::SenseTaggedWord)
WordNet导出sensekey(::DB, ::Synset, ::Lemma)


我想同时使用两个sensekey方法。

例如

对于某些混合项目列表:mixedlist::Vector{Union{Tuple{SenseTaggedWord},Tuple{DB, Synset,Lemma}}
即,列表中的项是1个元组的SenseTaggedWord和3个元组的DBSynsetLemma的混合。

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


应该管用。
这个示例有点滑稽,因为我为什么要像这样混合它们。
但是,希望它能说明一般情况下的问题。

尝试using CorpusLoaders.SemCor, WordNet将两个结果都放入WARNING: both WordNet and Semcor export "sensekey"; uses of it in module Main must be qualified.

手动导入两者:import CorpusLoaders.SemCor.sensekey; import WordNet.sensekey导致WARNING: 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的依赖项。

而且我想知道如何为包装的使用者解决问题,而不是作为包装的创建者。

最佳答案

在这种情况下,功能不会发生冲突,但是通常无法保证。稍后加载的程序包可能会将方法添加到可能冲突的功能之一中。因此,要对两个软件包都使用sensekey,还需要一些其他保证和限制。

一种方法是忽略这两个包的sensekey,而是提供自己的包,分派到正确的包:

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

10-06 02:02