我要使用两个软件包:CorpusLoaders.jl和WordNet.jl
CorpusLoaders.SemCor出口sensekey(::SenseTaggedWord)
WordNet导出sensekey(::DB, ::Synset, ::Lemma)
我想同时使用两个sensekey
方法。
例如
对于某些混合项目列表:mixedlist::Vector{Union{Tuple{SenseTaggedWord},Tuple{DB, Synset,Lemma}}
。
即,列表中的项是1个元组的SenseTaggedWord
和3个元组的DB
,Synset
和Lemma
的混合。
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)