Julia: モゞュヌルずむンポヌト゚むリアシング

䜜成日 2012幎09月05日  Â·  96コメント  Â·  ゜ヌス: JuliaLang/julia

モゞュヌルシステムの堎合、ドット衚蚘のモゞュヌルをむンポヌトしお䜿甚できたす。

import ArgParse
... 
    ArgParse.add_argument(p, "--opt1") 
...

これは、名前空間の汚染を防ぐのに圹立ちたす。 ただし、モゞュヌル名は冗長であるため、モゞュヌル゚むリアスがあるず䟿利です。

import ArgParse as ap 
... 
    ap.add_argument(p, "--opt1") 
...
design modules speculative

最も参考になるコメント

この問題は長い間存圚しおいたしたが、いく぀かの拡匵機胜に぀いおはただ議論する必芁がありたすが、

import LongPackage as longpkg

それ自䜓はかなり合理的なようです。

党おのコメント96件

私は数分前にあなたが次のこずができるこずに気づきたした

import ArgParse
ap = ArgParse

ap.add_argument(...)

ただし、構文糖衣ずしお「importas」衚蚘を䜿甚するずよいず思いたす。

私がここにいおそれに぀いお考えおいる間、 @ JeffreySarnoffのフォヌラム投皿で蚀及されおいるように、同じむンポヌト行に耇数の特定の関数をむンポヌトする方法があるず䟿利です。 問題を怜玢しおも、そのような芁求はただ明らかになりたせんでした。

䜕かのようなもの

# from the forum post
import Module.(export1,export2,export3)
# or
import Module.[export1,export2,export3]
# or maybe
import Module.{export1,export2,export3}

これずは別の問題ですが、関連しおいたす。 したほうがいい

  1. この問題を曎新する、たたは
  2. 新しい問題を䜜成する

私はそのような機胜の有甚性は物議を醞すものではないず思いたす...

線集これはimport Module: export1, export2, export3で動䜜するようになりたした

䟋えばもサポヌトするべきだず思いたす

import ArgParse.add_argument as addarg

むンポヌト時にモゞュヌルメンバヌの名前を倉曎できるようにしたす。

名前が倉曎された関数名がディスパッチにどのように参加するのか疑問に思っおいたすか

基本的には、 const foo = Base.barに盞圓する゚むリアスのように機胜する必芁がありたす。

基本的にぱむリアスのように機胜する必芁があり、const foo =ず同等です。
Base.bar。

関数をむンポヌトするずきは、それを䜿甚するか、オヌバヌラむドする予定です。 䞎えられた
䞊蚘、

Base.barをfooずしおむンポヌトしたす

fooをBase.barずしお䜿甚するこずは間違いありたせんが、fooを定矩するずオヌバヌラむドするこずもできたす
Base.bar それが必芁ですか

これは叀い問題ですが、0.2に近づいおいるので、これを再怜蚎する時が来たず思いたす。

コヌドを曞くずき、私はい぀もimport NumericExtensions as neを曞きたいず思っおいたので、これはサポヌトされおいないこずを自分自身に思い出させおしたいたした。

これを実装するのはそれほど難しいこずではないず思いたす。私の意芋では、これは曞くよりもはるかに優れおいたす。

import NumericExtensions
const ne = NumericExtensions

+1

+1

これはただ関係がありたすか 個人的には、モゞュヌルの゚むリアシングのために远加のfoo = Fooを実行するだけでもかたいたせんが、゚むリアシングシュガヌをサポヌトするためのコンセンサスがあったようです。 十分に匷く感じおいる人は、自分でPRをしなければならないかもしれたせん。
ただし、 x as yは、1470で説明したconvert(y,x)構文の最匷の候補の1぀であるこずに泚意しおください。 2぀を明確にするのはそれほど難しいこずではないようですが、泚意するだけです。

この機胜の䟡倀は、元の名前のむンポヌトを回避できるこずです。

+1
この機胜があれば玠晎らしいず思いたす。

+1

新しいキヌワヌドasを導入するのではなく、次のように=>挔算子を䜿甚するのはどうでしょうか。

import Tlahuixcalpantecuhtli => Venus: xxxxxxxxx => x9, yyyyyyyy => y8, zzz

これにより、同じ構文でモゞュヌルず倉数のサブセットの゚むリアシングが盎亀しお可胜になりたす。

わからない、それは私には本圓に醜いようだ。

import Tlahuixcalpantecuhtli as Venus: xxxxxxxxx as x9, yyyyyyyy as y8, zzz

それはもっずいいですか 私はそれがはるかに読みにくいず思いたす。

私は個人的に、 asは=>よりも自明であるず感じおいたす。これは、いく぀ものこずを意味する可胜性があるようです。

完党な開瀺Pythonバむアス。

asよりも$ =>構文の方が奜きです。

私はナッシュ均衡で立ち埀生しおいる自転車小屋が奜きです。

モゞュヌルの内郚シンボルを再バむンドするのはなぜですか あなたが本圓にそれをするべきではないので、その醜い。

Haskellのむンポヌト構文が奜きです。 Pythonの名前空間はJuliaのモゞュヌルよりもきめ现かいず思いたす。 ゞュリアのモゞュヌルは、ハスケルのモゞュヌルよりも粟神的に感じられるので、むンスピレヌションを埗るためにそこを探す必芁があるかもしれたせん。

私は@ssfrrに同意したすasキヌワヌドははるかに自明であり、Python / Haskellナヌザヌにはよく知られおいたす。 読みやすさで@StefanKarpinskiの問題を解決するには、Pythonのようなアプロヌチも圹立ちたす。

from Tlahuixcalpantecuhtli as Venus import xxxxxxxxx as x9, yyyyyyyy as y8, zzz

REPLず話しおいるような気がしたす。 しかし、私はこの皮の提案が実行可胜ではないこずを知っおいたす。

from Tlahuixcalpantecuhtli as Venus import xxxxxxxxx as x9, yyyyyyyy as y8, zzz

これは、Pythonで最も嫌いな構文䞊の遞択肢の1぀です。 意味を少し倉えるには、最初のキヌワヌドずすべおの順序を倉曎しお、行党䜓を根本的に再配眮する必芁がありたす。 それは他の茞入品ずは完党に異なっお芋え、ほずんど同じこずをするずいう事実を芆い隠しおいたす。 これはひどい構文蚭蚈であるimoであり、衚面的には英語に䌌おいるこずに重きを眮いおいたす。

+1 asの堎合、-1 fromの堎合

import a => b: c => d, e => fは、私には少しPerl颚に感じたす。

私はナッシュ均衡に぀いお聞いたこずがなく、それに぀いお読んだ埌、これがそれを構成するずは思わない。 しかし、面癜いこずに、このバむクシェッドは1時間に10の応答がありたすが、非垞に重芁なしかしより難しいず私を襲う6984の提案は、コメントなしで4時間になりたした

as察=>に関しおは、どちらも珟圚の状況よりも優れた改善になるでしょう。

6984の良い点@BobPortmann 。

=>はこれに最適だず思いたす、FWIW。

しかし、面癜いこずに、このバむクシェッドは1時間に10の応答がありたすが、非垞に重芁なしかしより難しいず私を襲う6984の提案は、コメントなしで4時間になりたした

パヌキン゜ンの元々の䟋えでは、この問題は自転車小屋であり、6984は原子炉です。

:)

私はこの鍋をかき混ぜるのは嫌いですが、私はasが奜きだず思いたす。 =>は少し曖昧であり、これが蟞曞ず構文を共有するのは奇劙です。 たぶん=だけが理にかなっおいたす import Foo: x = y 、これから行うconst x = Foo.yず同様です。

他に䜕もないずしおも、Haskellドキュメントのその衚は本圓に圹に立ちたす。 私はよく特にゞュリアを最初に孊んだずき、い぀import / using / requireを䜿甚するか、たたはい぀import Mod.thingを䜿甚するかに぀いお混乱したした。 import Mod: thing 。 私は実際にむンポヌトのコロン構文の説明を探しおいたしたが、芋぀かりたせんでした。

@jakebolewski Haskellの構文はかなり近いようです。JuliaのusingはHaskellの修食されおいない importず同等であり、JuliaのimportはHaskellのimport qualifiedず同等です。


出発点ずしお、これが珟圚利甚可胜なむンポヌト/䜿甚構文の良い芁玄であるこずをよりよく知っおいる誰かが確認できたすか 関数xずy Modがあり、゚クスポヌトされおいない関数pずqもあるずしたす。

import Modは、 Mod.x 、 Mod.y 、 Mod.p 、およびMod.q $をもたらしたす。 むンポヌトされた関数はすべおメ゜ッド拡匵に䜿甚できたす

using Modは、 x 、 y 、 Mod.x 、 Mod.y 、 Mod.p 、およびMod.q $をもたらしたす。 xずyはメ゜ッド拡匵には䜿甚できたせんが、 Mod.*は䜿甚できたす。

import Mod.x, Mod.pは、 x 、 p 、 Mod.x 、 Mod.y 、 Mod.p 、およびMod.q $をもたらしたす。 これらはすべおメ゜ッド拡匵に䜿甚できたす。

import Mod: x, pはimport Mod.x, Mod.pず同じです

using Mod.x, Mod.pは、 x 、 p 、 Mod.x 、 Mod.y 、 Mod.p 、およびMod.q $をもたらしたす。 xずpはメ゜ッド拡匵には䜿甚できたせんが、 Mod.*は䜿甚できたす。

using Mod: x, pはusing Mod.x, Mod.pず同じです

私が知る限り、 using Modは、 Modによっお゚クスポヌトされるものを気にする唯䞀の䜿甚法です。

モゞュヌルのドキュメントにこの芁玄があるず非垞に䟿利です。 誰かがこれを確認できるので、PRを準備できたすか

最も論争の少ないバヌゞョンは次のようです。

import Tlahuixcalpantecuhtli as Venus: xxxxxxxxx as x9, yyyyyyyy as y8, zzz

かっこいいです。 ただし、割り圓おバヌゞョンは興味深いものであり、テストしおみたす。

import Venus = Tlahuixcalpantecuhtli: x9 = xxxxxxxxx, y8 = yyyyyyyy, zzz

嫌いだろうず思っおいたのですが、実は結構いいです。 このモゞュヌルで玹介されおいる名前が最初に来お、最も目立぀のが奜きです。倚くの点で、それが最も重芁なこずです。

@jakebolewski モゞュヌルの内郚シンボルを再バむンドするのはなぜですか あなたが本圓にそれをするべきではないので、その醜い。

2぀の異なるモゞュヌルから名前が衝突するバむンディングをむンポヌトしたい堎合がありたす。これにより、それが可胜になりたす。 それらを完党に修食するこずもできたすが、゚むリアシングをサポヌトしおいる堎合は、これもサポヌトするこずをお勧めしたす。

いく぀かの適切に配眮された改行は、IMOをより読みやすくしたす。

import Tlahuixcalpantecuhtli as Venus:
    xxxxxxxxx as x9, 
    yyyyyyyy as y8,
    zzz

たた

import Venus = Tlahuixcalpantecuhtli: 
    x9 = xxxxxxxxx, 
    y8 = yyyyyyyy, 
    zzz

私は割り圓おバヌゞョンを非垞に匷く奜むこずがわかりたした。 結局のずころ、むンポヌトは割り圓おの䞀圢態です。

モゞュヌルのドキュメントにこの芁玄があるず非垞に䟿利です。 誰かがこれを確認できるので、PRを準備できたすか

@ brk00 、頑匵っお

@kmsquire 、今日はそれに取り組みたす

しかし、その前に、私はそれをよく理解しおいるこずを確認したいず思いたす。 @ssfrrの䟋では、REPLを䜿甚しおいお、 using Modず入力するずしたす。 むンポヌトされた関数xおよびyは、メ゜ッド拡匵には䜿甚できたせん。 ぀たり、別のx関数ずy関数を宣蚀するず、䞀床むンポヌトしたModのメ゜ッドにアクセスできなくなり、新しいメ゜ッドにのみアクセスできるようになりたすか

これは、関数をむンポヌトせずに拡匵しようずするずどうなるかです。

julia> module Mod

       export x, y

       x() = "x"
       y() = "y"
       p() = "p"
       q() = "q"

       end

julia> using Mod

julia> x()
"x"

julia> p()
ERROR: p not defined

julia> x(n) = n
ERROR: error in method definition: function Mod.x must be explicitly imported to be extended

次のようなメ゜ッドを远加できたす。

julia> import Mod: x # or import Mod.x

julia> x(n) = n
x (generic function with 2 methods)

julia> methods(x)
# 2 methods for generic function "x":
x() at none:5
x(n) at none:1

さお、私は名前解決の振る舞いに混乱したした

julia> module Mod

       export x, y

       x() = "x"
       y() = "y"
       p() = "p"
       q() = "q"

       end

julia> using Mod

julia> x(n) = n
x (generic function with 1 method)

using Modでむンポヌトした関数を䜿甚する前に、新しい関数をxに割り圓おおも、゚ラヌは発生したせん。 しかし、たずえば、新しい割り圓おの前にx()を呌び出すず䟋で行ったように、実際に゚ラヌが発生したす。

ああ、面癜い 私はそれに぀いお知りたせんでした。 usingの埌に名前空間を瀺すために、たたたたxを呌び出したした。

たぶん、コア開発者の1人が光を圓おるこずができたす。 xが呌び出され、オヌバヌロヌドの詊行時に゚ラヌがトリガヌされるずどうなりたすか

䞊蚘の@carlobaldassiによっお提案された゚むリアシングは、実際には非垞に䟿利です。

importがモゞュヌルオブゞェクトを返すだけで、 constの有無にかかわらず、割り圓おを䜿甚しお盎接゚むリアス化できるかどうか疑問に思っおいたす。 䟋えば

const Shortname = import ModuleWithLongName

それ以倖の

import ModuleWithLongName
const Shortname = ModuleWithLongName

これには、新しい構文は必芁ありたせん。既存の構文芁玠の組み合わせだけが必芁です。 珟圚、 importは「ステヌトメント」であり、玔粋に副䜜甚のために呌び出され、䟡倀がないこずを認識しおいたす。 パヌサヌがこれを蚱可しない堎合は、 import("Module")たたは同様のものをお勧めしたす。

モゞュヌルを゚むリアスするオプションは良いかもしれないず思いたすが、誰も蚀及しおいないずいう欠点もあるず思いたす。それはコヌドをかなり曖昧にする可胜性がありたす。 コヌドリヌダヌの芳点からは、モゞュヌルのわかりやすい名前を1぀だけ持぀ず䟿利です。

しかし、調べるのはかなり簡単ですか 短瞮圢は、 numpyのnpのような人気のあるパッケヌゞでも暙準化される可胜性がありたす。

暙準化されたnpよりもnumpyを奜み、$ numpyよりもArraysを奜みたす。 numpyは、1950幎代のダンスの動きず臎呜的な疫病の間のクロスのように聞こえたす。

簡単に曞くこずができたす

Base.require("ArgParse")
const ap = Main.ArgParse

これには1.0の構文は必芁ありたせん

このための構文が必芁だず思いたす。 はい、 requireずconstの割り圓おができるので、それがなくおも生きるこずができたすが、 requireを䜿甚するのはかなり醜く、䟿利な構文がないため、名前を倉曎できたせん。圌らが望む/必芁ずするように。

constの簡単なトリックは、マクロの゚むリアスを䜜成する必芁がある堎合には䞍十分です。これが私のやり方であり、理解するのに時間がかかりたした。

julia> macro foo(a, b, c)                                  
           a, b, c                                         
       end                                                 
<strong i="8">@foo</strong> (macro with 1 method)                                 

julia> macro f(args...)                                    
           Expr(:macrocall, Symbol("@foo"), args...) |> esc
       end                                                 
<strong i="9">@f</strong> (macro with 1 method)                                   

julia> <strong i="10">@f</strong> 1 2 3                                            
(1,2,3)                                                    

ImportMacros.jlで私は実装しおいたす

  • <strong i="15">@from</strong> Foo.Bar use foo as f
  • <strong i="18">@from</strong> Foo.Bar use <strong i="19">@foo</strong> as @f

参照 https //github.com/fredrikekre/ImportMacros.jl/pull/3

@ Ismael-VC

詊す

<strong i="7">@eval</strong> const $(Symbol("@foo")) = $(Symbol("@bar"))

これは醜いですが、マクロをロヌカルで定矩するよりも短く、おそらくより明確です

@TotalVerbよろしくお願いしたす

Julia + ImportMacrosに欠けおいる機胜は、モゞュヌルず、そのようなモゞュヌルから可倉数のオブゞェクトを゚むリアスし、゚むリアスなしで他のオブゞェクトをむンポヌトするこずの䞡方を゚むリアスするこずだけのようです。

  • <strong i="9">@from</strong> Foo.Bar as B use foo as f, <strong i="10">@bar</strong> as <strong i="11">@b</strong>, baz

たたはfromなし

  • import Foo.Bar as B: foo as f, <strong i="17">@bar</strong> as <strong i="18">@b</strong>, baz
  • import B = Foo.Bar: f = foo, <strong i="21">@b</strong> = <strong i="22">@bar</strong>, baz

最埌のものはマクロでは䞍可胜のようです

julia> parse("<strong i="26">@from</strong> Foo.Bar as B use foo as f, <strong i="27">@bar</strong> as <strong i="28">@b</strong>, baz")
:(<strong i="29">@from</strong> Foo.Bar as B use foo as (f,@bar(as,(@b(),baz))))

julia> parse("<strong i="30">@import</strong> Foo.Bar as B: foo as f, <strong i="31">@bar</strong> as <strong i="32">@b</strong>, baz")
:(<strong i="33">@import</strong> Foo.Bar as B:foo as (f,@bar(as,(@b(),baz))))

julia> parse("<strong i="34">@import</strong> B = Foo.Bar: f = foo, <strong i="35">@b</strong> = <strong i="36">@bar</strong>, baz")
ERROR: ParseError("unexpected \"=\"")
 in #parse#310(::Bool, ::Bool, ::Function, ::String, ::Int64) at .\parse.jl:184
 in (::Base.#kw##parse)(::Array{Any,1}, ::Base.#parse, ::String, ::Int64) at .\<missing>:0
 in #parse#311(::Bool, ::Function, ::String) at .\parse.jl:194
 in parse(::String) at .\parse.jl:194

提案された構文はすべお゚ラヌたたはたったくナンセンスであるため、これを実際に1.0で決定する必芁はありたせん。

元のモゞュヌルが再定矩された堎合、たずえばREPLのreload("...")によっお、モゞュヌル゚むリアスはどうなりたすか const M = MyModuleアプロヌチでは、 Mはリロヌド埌も叀いモゞュヌルを参照するため、 MyModule MyModule.nameでのみアクセスできたすが、アクセスできたせん。 M.name 。

その堎合、゚むリアス構文はconst M = Moduleのシンタックスシュガヌ以䞊である必芁がありたすが、代わりにMが垞にMyModuleず同じものを参照するようにしおください。

これにより、開発䞭にモゞュヌルをimport継続できるため、REPLワヌクフロヌも簡玠化されたすが、毎回 const以倖の゚むリアスを再確立するこずなく、より短い゚むリアスを介しおモゞュヌルを参照できたす。 reload 。

珟圚、 reloadは削陀されおいるため、この懞念は適甚されなくなりたした。

これはincludeにも圓おはたりたすか、それずも䜕かが足りたせんか 䞀般に、モゞュヌルが再定矩されるず、 import edモゞュヌル名は新しい定矩を参照し、割り圓おによっお定矩された゚むリアスは叀い定矩を参照したす。

いいえ、それは心配する必芁はありたせん。 むンポヌトされた名前は、通垞のimportを含め、モゞュヌルが再定矩されたずきに倉曎されるこずはありたせん。 倉曎されたのは、再床むンポヌトした堎合にむンポヌトされるモゞュヌルです。 むンポヌトされたものは垞に単なるバむンディングでした。

わかりたした、倚分私は自分自身を明確に衚珟しなかったので、ここに䟋がありたすあなたが内容でファむルtest.jlを䜜成するならば

module Tst
f() = 1
end

ロヌドしおTstをむンポヌトし、 Tstの゚むリアスを定矩すれば、すべお問題ありたせん。

julia> include("test.jl")
Tst

julia> import Tst

julia> const Tst2 = Tst
Tst

julia> Tst.f()
1

julia> Tst2.f()
1

test.jlをに倉曎した堎合

module Tst
f() = 2
end

そしお、REPLでincludeを再実行するず、モゞュヌルずその゚むリアスの動䜜が異なりたす。

julia> include("test.jl")
WARNING: replacing module Tst
Tst

julia> Tst.f()
2

julia> Tst2.f()
1

なぜそうなるのかはわかりたすが、 import Tst as Tst2のような゚むリアスを䜜成する堎合はそうならないはずです。

私はこれを0.6.2でテストしたしたが、珟時点では0.7でテストできないので、これがただ圓おはたるかどうかは今はしたせん。

あなたはそれをたったくむンポヌトしおいたせん。 含めるモゞュヌルは、スコヌプですでに定矩されおいたす。 importはノヌオペレヌションです。

本圓ですが、これは重芁ではありたせん。 重芁なのは、架空のimport Tst as Tst2のようなこずをするずどうなるかずいうこずです。 その堎合、このステヌトメントはノヌオペレヌションではありたせんが、゚むリアスを䜜成したす。

この゚むリアスがconst Tst2 = Tstのように機胜する堎合、モゞュヌルTstを再定矩するず、゚むリアスは叀いバヌゞョンのモゞュヌルを指すようになりたす。 これはどのような堎合でも望たしくありたせん。 ゚むリアスが新しいバヌゞョンのTstも指すようにするか、ナヌザヌに゚むリアスの再確立を匷制する必芁がありたす。 ただし、埌者の堎合、再確立せずに叀い゚むリアスを䜿甚するず、叀いモゞュヌルを指す代わりに゚ラヌがスロヌされたす。

それが完党にポむントです。 この問題は、モゞュヌル定矩ではなくimportに関数を远加するこずに関するものです。 importは動䜜せず、削陀するずコヌドにimportたたはusingがなくなるため、この問題ずは関係ありたせん。 モゞュヌルがimportず同じスコヌプで定矩されないように倉曎しおください。

import Tst as Tst2は、その名前にバむンドされおいるものに関しおはimport Tstず同じように機胜したす。これは垞にバむンドであり、必芁な魔法ではありたせん。 これは、モゞュヌルを定矩するずきに゚むリアスを远加するこずではありたせん。

蚀い換えれば、あなたのコヌドは基本的に、

a = Ref(1) # include
a = a # import
b = a # alias
a = Ref(2) # include again

たた、 aはa = aにたったくバむンドされおいないため、 b = aの動䜜に぀いお文句を蚀うのは意味がありたせん。 悪い䟋では、むンポヌトず同じスコヌプでモゞュヌルを定矩するこずの副䜜甚぀たり、同じスコヌプでa = aずa = Ref(...) が衚瀺されたす。

わかりたした。状況によっおは、割り圓おによっお定矩された゚むリアスが期埅どおりに機胜しない堎合があるこずを指摘したいず思いたす。 倚分私は悪い䟋を遞びたした。 これは、モゞュヌル゚むリアスを䜜成する構文 importに関連するかどうかに関係なくにずっお重芁かもしれないず思いたしたが、珟時点では、これはずにかく仮説です。 隒音でごめんなさい。

この問題は長い間存圚しおいたしたが、いく぀かの拡匵機胜に぀いおはただ議論する必芁がありたすが、

import LongPackage as longpkg

それ自䜓はかなり合理的なようです。

バンプ。 今のずころ、最善の解決策はどのようなものか疑問に思っおいたすか これが私がしおいるこずです

import LinearAlgebra
const linalg = LinearAlgebra

より良い解決策があれば私を蚂正しおください

それが珟圚の基準です。

〜構文はどうですか 圱響はわかりたせんが、芋た目は玠晎らしいです。 たた、〜は近䌌の蚘号ずしお䜿甚されたす。

import LongPackage ~ lp

@JeffreySarnoffがStefanを匕甚

@StefanKarpinski

これは、Pythonで最も嫌いな構文䞊の遞択肢の1぀です。 意味を少し倉えるには、最初のキヌワヌドずすべおの順序を倉曎しお、行党䜓を根本的に再配眮する必芁がありたす。 それは他の茞入品ずは完党に異なっお芋え、ほずんど同じこずをするずいう事実を芆い隠しおいたす。 これはひどい構文蚭蚈であるimoであり、衚面的には英語に䌌おいるこずに重きを眮いおいたす。

この堎合、〜はPython構文の英語のような偎面ずは䜕の関係もありたせん。 〜を芋るず、近䌌の数孊的抂念を認識しおいるだけだず思いたす。 10.001〜10。

ですから、そういう意味では、実は結構いいず思いたす。

import LongPackage ~ lp
import HugePackage ~ hp
import MassivePackage ~ mp
import GiantPackage ~ gp

:-)

わかりたした-Pythonを忘れおください-私はそのコメントを削陀しお

lp imports LongPlayingRecords
hp imports HewlettPackard
mp imports MilitaryPolice
gp imports PariForNumberTheory

私はもずもずそれが奜きではありたせんでしたが、倚くの人が自然にこれをasで曞きたいず思っおいるようです。 これは明確な構文コンテキストであるため、キヌワヌドなどずしお予玄する必芁はありたせん。

人々にそれが䜕を意味するのかを知らせるために_詊みる_プログラミング蚀語

@JeffreySarnoff

Pythonよりも優れたものにしようずするプログラミング蚀語!!!

@neilpanchal Juliaは間違いなく、倚くの点でPythonよりも優れおいるこずを詊みる蚀語です。 䞀方で、Pythonが䜕かを正しく理解したPythonずは_異なる_こずは、明らかにその方法から倖れるこずはありたせん。 Juliaは、Pythonの巊右の構文芏則を借甚しおいたす。

Python asを採甚しおください。 圌らはそれを正しく理解したした。

julia> LightGraphsをlgずしおむンポヌト
゚ラヌ構文匏の終わりの埌に远加のトヌクン「as」

Pythonから離れたasを支持するもう1぀の$ 0.02コメント。 fwiw、ゞュリアを定期的に䜿甚しおいるので、これが恋しいです。 Pythonの堎合ずは異なり、Clojure䟋を参照の堎合ず同様に、パッケヌゞスコヌプの名前空間曖昧さ回避に適しおいたすを簡略化しお、ラむブラリを明瀺的に䜿甚する方がはるかに䟿利です。 using ぀たり、ワむルドカヌドのむンポヌトがimport Gadlfy as gfに構文䞊の砂糖を持たないようにするこずを奜むので、 const gf =行を远加しないでください私が珟圚行っおいるこず䟿利になりたす。

as構文をサポヌトするさらに別のコメントheart将来のJuliaリリヌスで本圓に難しいこずを願っおいたす。

私もこれが起こるこずを望みたす。 特にそれは重倧な倉化ではないのでそうですか。

これはい぀か実装されるず思いたすが時間を䜜るこずができれば自分で詊しおみたす、それたでの間、 ImportMacrosパッケヌゞには、ここで芁求された機胜のほずんどすべおが含たれおいたすドキュメントはありたせんが 

<strong i="8">@import</strong> ModuleA as ma
<strong i="9">@using</strong> ModuleB as mb
<strong i="10">@from</strong> ModuleC use long_function_name as func
<strong i="11">@from</strong> Module use <strong i="12">@macroname</strong> as <strong i="13">@alias</strong>

ImportMacros .jlに぀いお知りたせんでした、指摘しおくれおありがずう。 この機胜がパッケヌゞに含たれおいる堎合、基本蚀語で䜿甚するこずはそれほど重芁ではないず思いたす。

私はただこれが蚀語で持っおいるのは良いこずだず思いたす。

むンポヌトはIMOであり、マクロでラップしたり、パッケヌゞの䟝存関係を远加したりするのではなく、ほが_垞に_基本蚀語の芏則に埓う必芁がありたす。 import ... constは、特に2぀のステップのプロセスをより簡朔にするために基本蚀語が拡匵されおいない堎合でも、フォヌルバックするのに適しおいたす。

特に、芋るのは少し醜いです

using ImportMacros
<strong i="6">@using</strong> OtherPackage as ...
<strong i="7">@using</strong> ThirdPackage as ...

非マクロusingが突き出おいるからです。

importがモゞュヌル/関数/実際にスコヌプにもたらすものを返すのはどうですか
その埌、あなたは曞くこずができたす
lg = import LightGraphs
baz = import foo.bar
baz, kit, kat = import foo : bar1, bar2, bar3
倉曎が必芁なのはむンポヌト機胜だけです

@DhruvaSambraniの゜リュヌションは、Juliaの党䜓的な「すべおが衚珟である」アプロヌチに適合しおいるため、私は本圓に気に入っおいたす。

唯䞀のこずは、䞀貫性を保぀ために、むンポヌト匏は、フルネヌムをスコヌプに入れるずいう副䜜甚を実行する必芁があるずいうこずですおそらく灜害ではありたせん。 フルネヌムをむンポヌトしないように特殊なケヌスにするこずもできたすが、特殊なケヌスはグロスです。

OCaml最高のモゞュヌルを備えた蚀語では、次のようなこずができたす。

module LG = LightGraphs

ここでの重芁な違いは、OCamlプログラムでコンパむルされるすべおのモゞュヌルの修食名が自動的にスコヌプ内にあるこずです。

もちろん、 import LightGraphs as LGを䜿甚するこずには、「誰もが」Pythonからすでに知っおいるずいう利点がありたすが、私の個人的な奜みは、文字通り割り圓おであるものに割り圓お構文を再利甚する方がよいずいうこずです。

たたは、より広範な倉曎は、タむプずしお「名前空間」を導入するこずですすでに行われおいる堎合はidk。 次に、 importは、モゞュヌルなどを名前空間に展開しお、名前空間を返すこずができたす。 ただし、 import mod_nameを実行するだけでは、グロヌバルスコヌプでmod_name名前空間を䜿甚できないため、これによりすべおのJuliaコヌドが砎損したす。 むンポヌトが先行する割り圓おなしで䜿甚されるずきに、䜕らかの方法でmod_name名前空間をグロヌバルで䜿甚できるようにするこずができれば、それは問題ではありたせん。

たたは、新しい関数import_as_ns(mod_name) :: Namespaceを远加するだけです。これは、単䞀の名前空間ですべおの関数/モゞュヌルなどを返す玔粋関数になりたす。

それはゞュリアの党䜓的な「すべおが衚珟である」アプロヌチに適合したす

ただし、 importずusingは、副䜜甚のためにのみ䜿甚され、トップレベルでのみ䜿甚されるため、特別です。

ちなみに、この問題は長い間開かれおいるこずを考えるず、トリアヌゞはそれを再怜蚎しお決定するこずをいずわないのではないかず思いたす。 以来、私は閉鎖を提唱したす

  1. import Foo; const Bar = Fooは、ナヌザヌが名前空間のFooを気にしない堎合に、完璧な゜リュヌションを提䟛したす。
  2. ImportMacros.jlが残りを凊理する必芁がありたす。
  3. どちらも、特別な構文を保蚌するために実際のコヌドで非垞に頻繁に䜿甚されおいるようです。

結局のずころ、私はただこれを芋逃しおいるず蚀いたすそしお私は自分のコヌドでImportMacrosも䜿甚しおいたす。

私はあなたが曞いおいるコヌヒヌのスタむルがこれの必芁性たたは欲求に圱響を䞎えるず思いたす。 MLや科孊的なコヌドを曞いおいるずき、私はそれをあたり芋逃しおいないこずに気づきたす。 長い名前のパッケヌゞを倚数䜿甚する他のコヌドを曞いたずきは、ImportMacrosを最もよく䜿甚しおいるこずがわかりたした。

ImportMacrosで十分です。 私はそれがそれほどきれいに芋えないずいうコメントに同意したす。

たた、゚ディタヌでオヌトフォヌマッタヌを䜿甚しおむンポヌトを䞊べ替えるこずができる日も楜しみにしおいたす...しかし、 @usingをどうすればよいかわからない可胜性がありたす...

@kmsquireにも同意したす。これはそれほど倧きな問題ではなく、ImportMacrosで十分なはずです。 ただし、どのような方法でも、二床ず出おこないように文曞化する必芁がありたす。

ただm=import Module砂糖が欲しいのですが😅

私のメッセヌゞがこれが倧したこずではないこずを意味するこずを意図しおいたせんでした。

私はただこのための構文を奜みたす。

ImportMacrosで十分です。 私はそれがそれほどきれいに芋えないずいうコメントに同意したす。

同意したす。 たた、次の堎合

using ImportMacros
<strong i="8">@using</strong> OtherPackage as ...

初心者やプログラミング初心者に蚀語を提瀺するずきに、特定のスクリプトがこの矛盟から始たる理由を説明するのは少し面倒です。これは、流れを耇雑にし、教育の焊点を倉えるためです。

どちらも、特別な構文を保蚌するために実際のコヌドで非垞に頻繁に䜿甚されおいるようです

人々が実際のコヌドでImportMacrosをあたり䜿甚しない理由は、トレヌドオフが原因である可胜性がありたす。 たずえば、私はほが毎回import ... as ...を䜿甚したすが、それを行うために最初に別のパッケヌゞをむンポヌトする必芁がない可胜性がありたす。 远加の䟝存関係だけでなく、「感觊」の点でも圱響がありたすそしお、コヌドが掗緎されたように芋えるのが奜きな人もいたす特にPythonやJulia🀷‍♂、そしおこのusing/@usingはかなり「スクリプトの導入に察するハッキヌな雰囲気。

そうですね、「ImportMacrosで十分です」。 本圓に䜿いたい人のために。 しかし、それは重芁な問題ではなく、人々はそれなしで働くこずができたす。 それにもかかわらず、私は通垞、蚀語の構文が固執するのはこれらの小さなこずであるず匷く信じおいたす。したがっお、このモンスタヌスレッドはそのサポヌトをベヌスに远加したす。

import ... as ...は間違いなく䟡倀のある糖衣構文であり、理解ず説明が非垞に簡単で、パッケヌゞの名前がかなり長い傟向があるJuliaなどの蚀語で特に圹立ちたす明らかに、これは重芁です人々がusing ...をやりたくないずいう仮定の䞋でのみ。

そしお、Pythonが最初にそれを実装したずいう事実は、実際には関係がないはずです。 ゞュリアは、他の蚀語から距離を眮いたり、独自のアむデンティティを匷調したりする前に、最高の構文を䜿甚するように努める必芁がありたす。

このための構文ず人気のあるモゞュヌルに関する芏則私はそれが垞にimport numpy as npずimport matplotlib.pyplot as pltである方法を考えおいたすも、 using SuchAndSuchを実行しおexportに䟝存する代わりに簡朔な代替手段を提䟛したす

@DominiqueMakowski 

初心者やプログラミング初心者に蚀語を提瀺しお、特定のスクリプトがこの矛盟で始たる理由を説明する

なぜそれが矛盟だず思うのか理解できたせん。それは単に名前空間管理であり、これは䞀般的なプログラミングの通垞の郚分です。

たた、モゞュヌルの名前倉曎は、Juliaの初心者が最初に遭遇するものではない堎合がありたす。

ナヌスケヌスがないず蚀っおいるわけではありたせんが、独自のキヌワヌドを正圓化するこずはたれかもしれたせん。 珟時点では、 using ImportMacrosを怜玢するず、Githubで10未満の䞀意の結果が埗られたす。

私はimport ... as ...をほが毎回䜿甚したすが、それを行うために最初に別のパッケヌゞをむンポヌトする必芁はないでしょう。

これにより、䞡方の方法が削枛されたす。 ImportMacrosや远加の蚘号 import LongFoo; const Foo = LongFoo などのligthweightパッケヌゞを䜿甚する非垞に小さなコストがメリットに倀しない堎合、メリットはそれほど倧きくない可胜性がありたす。 。

ゞュリアは、他の蚀語から距離を眮いたり、独自のアむデンティティを匷調したりする前に、最高の構文を䜿甚するように努める必芁がありたす。

これがこの議論の動機であるずあなたが考える理由はわかりたせん。

constの割り圓おがうたく機胜しない堎合は、 asを䜿甚したい堎合がありたす。

julia> using Distributed

julia> import Future; const future = Future
Future

julia> Future === Distributed.Future # oops, this is what we wanted
false

julia> Future === future # not what we wanted `Future` to mean
true

はい、これを回避するこずはできたすが、厄介です。 それはしばしば䟿利で、時には必芁であり、 import FooBar as FBは䞀般的に合意された「最も意倖な」構文であるこずを考えるず、それは私たちがやるべきこずのように思えたす。 この必芁なのは、誰かがそれを実装するPRを䜜成するこずだけです。

新しいJuliaナヌザヌはこちら。
私は䞻にRのバックグラりンドを持ち、Pythonも䜿甚しおいたす。 usingのような読み蟌みメカニズムがもたらすパッケヌゞの共通名前空間に぀いおは悪い経隓がありたす。 衝突のリスクは1぀ですが、読みやすさの芳点からするず、各メ゜ッドのモゞュヌルに぀いお垞に考えるずいう粟神的な負担になりたす。

この構文の远加がどれほど耇雑かわかりたせんか それは初心者のために実行可胜ですか

おそらくそれほど簡単ではありたせん。 これには、Schemeで蚘述されたパヌサヌコヌドをハッキングし、倉曎をASTを介しお配線し、䞀郚のCコヌドにも圱響を䞎える可胜性がありたす。

これは、耇数のモゞュヌルでの関数名の競合を回避するための優れた機胜です。

たるみに぀いおの議論から、私はいく぀かの考えを远加したす

これにより、関数名の遞択や正しい関数ぞのメ゜ッドの適切な远加に泚意を払わなくなるのではないかず思いたす。 たずえば、

numpy.sin
sympy.sin

異なる関数は、数倀入力ず蚘号入力の䞡方で機胜させたい堎合に、関数の2぀のバヌゞョンを実装する必芁がある確実な方法です。 利䟿性のためにそのような名前空間がゞュリアでも普及した堎合、倚くのコヌドの再利甚を逃す可胜性がありたすか ぀たり、Lyndonがhttps://www.oxinabox.net/2020/02/09/whycompositionaljulia.htmlに掲茉したように、これによっお「人々が䞀緒に働くこずを奚励する」こずが少なくなるのではないかず心配しおいたす。

@baggepinnenこれはその点で䜕も倉わらないず思いたす。

Juliaでは、異なるモゞュヌルに実装されたメ゜ッドは、䞡方のメ゜ッドを同じ名前空間にむンポヌトするこずによっおマヌゞされたせん。

julia> module Foo
           export sin
           sin(s::String) = uppercase(s)
       end
Main.Foo

julia> sin(1)
0.8414709848078965

julia> using .Foo
WARNING: using Foo.sin in module Main conflicts with an existing identifier.

julia> sin("wat")
ERROR: MethodError: no method matching sin(::String)
Closest candidates are:
  sin(::BigFloat) at mpfr.jl:727
  sin(::Missing) at math.jl:1197
  sin(::Complex{Float16}) at math.jl:1145
  ...
Stacktrace:
 [1] top-level scope at REPL[4]:1
 [2] run_repl(::REPL.AbstractREPL, ::Any) at /build/julia/src/julia-1.5.1/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:288

julia> Foo.sin("wat")
"WAT"

これを機胜させるには、元の関数にディスパッチを明瀺的に远加する必芁がありたす。

julia> Base.sin(s::String) = Foo.sin(s)

julia> sin("wat")
"WAT"

私の知る限り、モゞュヌルの゚むリアシングによっお関数のディスパッチ方法を倉曎する方法はありたせん。

そしお正盎なずころ、同じ名前のいく぀かの関数は別々の名前空間に存圚する必芁がありたす。 数倀ラむブラリのfind_delta関数は、ファむル差分ラむブラリのfind_deltaずは関係のないこずを実行したす。 コヌドが非垞に倚圢になり、壊れた入力で実行する方法が芋぀かるず、JavaScriptの領域に入り、誰もそれを望んでいたせん。

@ninjaaron䞊蚘の懞念事項のニュアンスを䌝えるこずができなかった可胜性がありたす。 私は、この倉曎によっお、ラむブラリを実装するずきに人々が遞択する戊略以倖のものが倉わるこずには関心がありたせん。
Foo実装しおいる人が次のような譊告に遭遇したした

julia> using .Foo
WARNING: using Foo.sin in module Main conflicts with an existing identifier.

単にimport .Foo.sin as sin2を遞択するか、圌が本圓にBase.sinの新しいディスパッチを提䟛したいかどうかを考えるこずができたす。 私の蚀いたいこずは、それらを単玔に異なる関数ず芋なすこずが非垞に簡単になるず、実際には同じ関数の異なるメ゜ッドである必芁がある堎合でも、これが広すぎる可胜性があるずいうこずです。 同じ名前の異なる機胜を扱うのが少し厄介な珟圚の状況には、人々が互いに話し合い、それが本圓に同じ機胜であるかどうかを刀断するために最善を尜くすずいう玠晎らしい副䜜甚がありたす。 私は、同じ名前で異なる機胜を持぀可胜性に異議を唱えおいるわけではありたせん。もちろん、これは非垞に䟿利です。 私の懞念が重芁であるかどうかさえわかりたせんが、それが考慮されおいるこずを確認するためにそれを持ち䞊げる䟡倀があるず考えたした。

@baggepinnenそれは理にかなっおいたす、そしおそれを持ち出すこずに害はありたせん。 モゞュヌルの゚むリアシングはラむブラリナヌザヌにのみ圱響するため、これがラむブラリを䜜成する人々に倧きな違いをもたらすずは思いたせん。 モゞュヌルの゚むリアシングが簡単になるず、名前の競合に぀いお_䞍平を蚀う_ナヌザヌが少なくなる可胜性があるず思いたすが、それがAPIに倚倧な圱響を䞎えるずしたら驚きたす。

ラむブラリを䜜成するずき、私は通垞、Baseの関数にディスパッチを远加するのか、それずも個別に保持するのかをかなり意識しおいたす。 他のほずんどの図曞通の著者もそうだず思いたす。

@ninjaaron珟圚のコンベンションがディスパッチに特定の実装を䜿甚しおいる堎合

numpy.sin
sympy.sin

ナヌザヌ/開発者向けの远加オプションずしおimport numpy.sin as np_sinを䜿甚しおも、珟圚のコヌドベヌスに圱響を䞎えるこずはありたせん。
唯䞀の懞念は、公開機胜/むンタヌフェヌスにのみ圱響を䞎えるこずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡