__Name__ == “__main__”: කරන්නේ නම් කුමක් කරන්නේද?


6070

පහත කේතය අනුව, if __name__ == "__main__":කරන්නේ කුමක්ද?

# Threading example
import time, thread

def myfunction(string, sleeptime, lock, *args):
    while True:
        lock.acquire()
        time.sleep(sleeptime)
        lock.release()
        time.sleep(sleeptime)

if __name__ == "__main__":
    lock = thread.allocate_lock()
    thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
    thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))

ඇත if __name__ == "__main__":වාරණ තත්ත්වය අතහැර දමා / python, 3 වැනි දුර obsoleted? එය සඳහන් කරමින් මම යම් තොරතුරු සොයාගෙන ඇත.
carloswm85

2
@ carloswm85 එය සත්‍ය නොවේ.
ජෝජෝස් මිරියන්තස්

Answers:


6653

පයිතන් පරිවර්තකයා ප්‍රභව ගොනුවක් කියවන සෑම විටම එය කරුණු දෙකක් කරයි:

  • එය වැනි විශේෂ විචල්‍යයන් කිහිපයක් සකසයි __name__, පසුව

  • එය ගොනුවේ ඇති සියලුම කේත ක්‍රියාත්මක කරයි.

__name__පයිතන් ස්ක්‍රිප්ට් වල අප සැමවිටම දකින චෙක්පත් පිළිබඳ ඔබේ ප්‍රශ්නයට මෙය සම්බන්ධ වන්නේ කෙසේද සහ එය සම්බන්ධ වන්නේ කෙසේදැයි බලමු .

කේත නියැදිය

ආනයන සහ ස්ක්‍රිප්ට් ක්‍රියා කරන ආකාරය ගවේෂණය කිරීමට තරමක් වෙනස් කේත නියැදියක් භාවිතා කරමු. පහත දැක්වෙන්නේ ගොනුවක යැයි සිතමු foo.py.

# Suppose this is foo.py.

print("before import")
import math

print("before functionA")
def functionA():
    print("Function A")

print("before functionB")
def functionB():
    print("Function B {}".format(math.sqrt(100)))

print("before __name__ guard")
if __name__ == '__main__':
    functionA()
    functionB()
print("after __name__ guard")

විශේෂ විචල්යයන්

පයිතන් අතුරුමුහුණත ප්‍රභව ගොනුවක් කියවන විට, එය පළමුව විශේෂ විචල්‍යයන් කිහිපයක් අර්ථ දක්වයි. මෙම අවස්ථාවේ දී, අපි __name__විචල්යය ගැන සැලකිලිමත් වෙමු .

ඔබේ මොඩියුලය ප්‍රධාන වැඩසටහන වන විට

ඔබ ඔබේ මොඩියුලය (ප්‍රභව ගොනුව) ප්‍රධාන වැඩසටහන ලෙස ක්‍රියාත්මක කරන්නේ නම්, උදා

python foo.py

පරිවර්තකයා දෘඩ කේත "__main__"කරන ලද __name__නූල විචල්‍යයට පවරයි , එනම්

# It's as if the interpreter inserts this at the top
# of your module when run as the main program.
__name__ = "__main__" 

ඔබේ මොඩියුලය වෙනත් අයෙකු විසින් ආනයනය කරන විට

අනෙක් අතට, වෙනත් මොඩියුලයක් ප්‍රධාන වැඩසටහන වන අතර එය ඔබේ මොඩියුලය ආනයනය කරයි යැයි සිතමු. මෙයින් අදහස් කරන්නේ ප්‍රධාන වැඩසටහනේ හෝ වෙනත් මොඩියුලයක ප්‍රධාන වැඩසටහන ආනයනය කරන ප්‍රකාශයක් ඇති බවයි:

# Suppose this is in some other main program.
import foo

පරිවර්තකයා ඔබේ foo.pyගොනුව සොයනු ඇත (වෙනත් ප්‍රභේද කිහිපයක් සෙවීම සමඟ), සහ එම මොඩියුලය ක්‍රියාත්මක කිරීමට පෙර, එය "foo"ආනයන ප්‍රකාශයේ සිට __name__විචල්‍යයට නම පවරනු ඇත , එනම්

# It's as if the interpreter inserts this at the top
# of your module when it's imported from another module.
__name__ = "foo"

මොඩියුලයේ කේතය ක්‍රියාත්මක කිරීම

විශේෂ විචල්‍යයන් සැකසූ පසු, පරිවර්තකයා මොඩියුලයේ ඇති සියලුම කේත ක්‍රියාත්මක කරයි, වරකට එක් ප්‍රකාශයක්. කේත නියැදිය සමඟ පැත්තේ තවත් කවුළුවක් විවෘත කිරීමට ඔබට අවශ්‍ය විය හැකි අතර එවිට ඔබට මෙම පැහැදිලි කිරීම සමඟ අනුගමනය කළ හැකිය.

සැමවිටම

  1. එය නූල් මුද්‍රණය කරයි "before import"(උපුටා දැක්වීම් නොමැතිව).

  2. එය mathමොඩියුලය පටවා විචල්‍යයක් ලෙස නම් mathකරයි. මෙය import mathපහත සඳහන් දෑ සමඟ ප්‍රතිස්ථාපනය කිරීමට සමාන වේ (සටහන __import__පයිතන් හි පහත් මට්ටමේ ශ්‍රිතයක් වන අතර එය නූලක් ගෙන සත්‍ය ආනයනය අවුලුවන):

# Find and load a module given its string name, "math",
# then assign it to a local variable called math.
math = __import__("math")
  1. එය නූල් මුද්‍රණය කරයි "before functionA".

  2. එය defබ්ලොක් එක ක්‍රියාත්මක කරයි , ශ්‍රිත වස්තුවක් නිර්මාණය කරයි, පසුව එම ශ්‍රිත වස්තුව නම් විචල්‍යයකට පවරයි functionA.

  3. එය නූල් මුද්‍රණය කරයි "before functionB".

  4. එය දෙවන defවාරණය ක්‍රියාත්මක කරමින් තවත් ශ්‍රිත වස්තුවක් නිර්මාණය කර එය විචල්‍යයකට පවරයි functionB.

  5. එය නූල් මුද්‍රණය කරයි "before __name__ guard".

ඔබේ මොඩියුලය ප්‍රධාන වැඩසටහන වන විට පමණි

  1. ඔබේ මොඩියුලය ප්‍රධාන වැඩසටහන නම්, එය __name__සැබවින්ම සකසා ඇති බව පෙනෙනු ඇති "__main__"අතර එය ශ්‍රිත දෙක අමතයි, නූල් මුද්‍රණය කිරීම "Function A"සහ "Function B 10.0".

ඔබේ මොඩියුලය වෙනත් අයෙකු විසින් ආනයනය කළ විට පමණි

  1. ( ඒ වෙනුවට ) ඔබේ මොඩියුලය ප්‍රධාන වැඩසටහන නොව වෙනත් එකක් විසින් ආනයනය කරන ලද්දක් නම්, එසේ __name__වනු ඇත "foo", නැත "__main__", එය ifප්‍රකාශයේ සිරුර මඟ හරිනු ඇත .

සැමවිටම

  1. එය "after __name__ guard"අවස්ථා දෙකේදීම නූල මුද්‍රණය කරනු ඇත .

සාරාංශය

සාරාංශයක් ලෙස, අවස්ථා දෙකෙහි මුද්‍රණය කළ යුතු දේ මෙන්න:

# What gets printed if foo is the main program
before import
before functionA
before functionB
before __name__ guard
Function A
Function B 10.0
after __name__ guard
# What gets printed if foo is imported as a regular module
before import
before functionA
before functionB
before __name__ guard
after __name__ guard

එය මේ ආකාරයෙන් ක්‍රියාත්මක වන්නේ ඇයි?

ඕනෑම කෙනෙකුට මෙය අවශ්‍ය වන්නේ මන්දැයි ඔබ ස්වභාවයෙන්ම කල්පනා කළ හැකිය. හොඳයි, සමහර විට ඔබට .pyවෙනත් වැඩසටහන් සහ / හෝ මොඩියුලයන් මොඩියුලයක් ලෙස භාවිතා කළ හැකි ගොනුවක් ලිවීමට අවශ්‍ය වන අතර ප්‍රධාන වැඩසටහන ලෙසම ක්‍රියාත්මක කළ හැකිය. උදාහරණ:

  • ඔබේ මොඩියුලය පුස්තකාලයකි, නමුත් ඔබට අවශ්‍ය වන්නේ ස්ක්‍රිප්ට් මාදිලියක් තිබීමයි, එහිදී එය ඒකක පරීක්ෂණ හෝ නිරූපණයක් ක්‍රියාත්මක කරයි.

  • ඔබේ මොඩියුලය ප්‍රධාන වැඩසටහනක් ලෙස පමණක් භාවිතා කරයි, නමුත් එයට ඒකක පරීක්ෂණ කිහිපයක් ඇති අතර, පරීක්ෂණ රාමුව ක්‍රියාත්මක වන්නේ .pyඔබේ ස්ක්‍රිප්ට් වැනි ගොනු ආනයනය කිරීමෙන් සහ විශේෂ පරීක්ෂණ කාර්යයන් ක්‍රියාත්මක කිරීමෙනි . එය මොඩියුලය ආනයනය කරන නිසා එය ස්ක්‍රිප්ට් ධාවනය කිරීමට උත්සාහ කිරීම ඔබට අවශ්‍ය නැත.

  • ඔබේ මොඩියුලය බොහෝ දුරට ප්‍රධාන වැඩසටහනක් ලෙස භාවිතා කරයි, නමුත් එය උසස් පරිශීලකයින් සඳහා ක්‍රමලේඛ-හිතකාමී API ද සපයයි.

එම උදාහරණ වලින් ඔබ්බට, පයිතන් හි පිටපතක් ධාවනය කිරීම යනු මැජික් විචල්‍යයන් කිහිපයක් සැකසීම සහ පිටපත ආනයනය කිරීම පමණි. ස්ක්‍රිප්ට් එක "ධාවනය කිරීම" යනු ස්ක්‍රිප්ට් මොඩියුලය ආනයනය කිරීමේ අතුරු ආබාධයකි.

සිතුවිලි සඳහා ආහාර

  • ප්‍රශ්නය: මට බහුවිධ __name__පිරික්සුම් කොටස් තිබිය හැකිද? පිළිතුර: එසේ කිරීම අමුතු දෙයක්, නමුත් භාෂාව ඔබව නවත්වන්නේ නැහැ.

  • පහත දැක්වෙන්නේ යැයි සිතමු foo2.py. python foo2.pyවිධාන රේඛාවේ ඔබ පැවසුවහොත් කුමක් සිදුවේද ? මන්ද?

# Suppose this is foo2.py.

def functionA():
    print("a1")
    from foo2 import functionB
    print("a2")
    functionB()
    print("a3")

def functionB():
    print("b")

print("t1")
if __name__ == "__main__":
    print("m1")
    functionA()
    print("m2")
print("t2")
  • දැන්, ඔබ __name__පිරික්සුම ඉවත් කළහොත් කුමක් සිදුවේදැයි සොයා බලන්න foo3.py:
# Suppose this is foo3.py.

def functionA():
    print("a1")
    from foo3 import functionB
    print("a2")
    functionB()
    print("a3")

def functionB():
    print("b")

print("t1")
print("m1")
functionA()
print("m2")
print("t2")
  • පිටපතක් ලෙස භාවිතා කරන විට මෙය කරන්නේ කුමක්ද? මොඩියුලයක් ලෙස ආනයනය කරන විට?
# Suppose this is in foo4.py
__name__ = "__main__"

def bar():
    print("bar")

print("before __name__ guard")
if __name__ == "__main__":
    bar()
print("after __name__ guard")

14
කුතුහලයෙන් තොරව: මම subprocess.run('foo_bar.py')පයිතන් පිටපතක් ධාවනය කරන්නේ නම් කුමක් සිදුවේද ? මම එය සෙන්ටිමීටරයෙන් අතින් ඇලවූ විට මෙන් foo_barආරම්භ වනු ඇතැයි සිතමි . එය එසේද? RMrFooz ගේ පිළිතුර සැලකිල්ලට ගනිමින් මෙය සිදු කිරීමේදී කිසිදු ගැටළුවක් නොවිය යුතු අතර මා කැමති වේලාවක “ප්‍රධාන” මොඩියුලයන් තිබීම. අගය වෙනස් කිරීම හෝ ස්වාධීනව කිහිපයක් නිර්මාණය කිරීම පවා එකිනෙකා සමඟ අන්තර්ක්‍රියා කරන අවස්ථා (හෝ එකිනෙකා විසින් නිර්මාණය කරන ලද අවස්ථා ) පයිතන් සඳහා සුපුරුදු පරිදි ව්‍යාපාරයක් විය යුතුය. මට යමක් මග හැරී තිබේද? __name__ = '__main__'foo_bar.py__name__subprocess
හජෙෆ්

12
jhajef දේවල් සමඟ කටයුතු කරන්නේ කෙසේද යන්න පිළිබඳව ඔබ නිවැරදිය subprocess.run. සාමාන්‍යයෙන්, ස්ක්‍රිප්ට් අතර කේත බෙදා ගැනීමේ වඩා හොඳ ක්‍රමයක් වන්නේ මොඩියුල සෑදීම සහ ස්ක්‍රිප්ට් එකිනෙකාට ස්ක්‍රිප්ට් ලෙස ආයාචනා කරනවා වෙනුවට හවුල් මොඩියුල ලෙස හැඳින්වීමයි. subprocess.runබොහෝ නිදොස් කරන්නන් ක්‍රියාවලි සීමාවන් ඉක්මවා නොයන බැවින් ඇමතුම් නිදොස් කිරීම දුෂ්කර ය , අමතර ක්‍රියාදාමයන් නිර්මාණය කිරීම හා විනාශ කිරීම සඳහා සුළු නොවන පද්ධති ඉහළින් එකතු කළ හැකිය.
ෆූස් මහතා

4
සිතුවිලි සඳහා ආහාර පිළිබඳ foo2.py උදාහරණයේ මට සැකයක් ඇත. foo2.py ආනයන ශ්‍රිතයෙන් කුමක් කරන්නේද? මගේ මතය අනුව එය functionB වෙතින් පරිශීලක foo2.py ආනයනය කරයි
user471651

1
RMrFooz මම කවදාවත් මේ වගේ දෙයක් කරන්න අදහස් කළේ නැහැ xD එය මගේ මතකයට ආවා. මේ වගේ දේවල් වටා ඔවුන්ගේ මනස ඔතා. 47 user471651 from foo2 import functionBfunctionB වෙතින් foo2 ආනයනය කළ යුත්තේ ඇයි ? එය අර්ථකථන විකෘතියකි. from module import methodමොඩියුලයෙන් ක්‍රමය ආනයනය කරයි.
හජෙෆ්

2
ඔබේ කේතය ආනයනය කළ හැකි මොඩියුලවලින් එකක් නම් multiprocessing, විශේෂයෙන් මෙම පරීක්ෂණය වින්ඩෝස් හි අවශ්‍ය කිරීමයි.
යාන් වර්නියර්

1801

ඔබේ පිටපත පයිතන් පරිවර්ථකයාට විධානයක් ලෙස ලබා දීමෙන් එය ක්‍රියාත්මක වන විට,

python myscript.py

ඉන්ඩෙන්ටේෂන් මට්ටමේ 0 හි ඇති සියලුම කේත ක්‍රියාත්මක වේ. අර්ථ දක්වා ඇති කාර්යයන් සහ පන්ති, හොඳින්, අර්ථ දක්වා ඇත, නමුත් ඒවායේ කේත කිසිවක් ක්‍රියාත්මක නොවේ. වෙනත් භාෂාවන් මෙන් නොව, main()ස්වයංක්‍රීයව ක්‍රියාත්මක වන කිසිදු ශ්‍රිතයක් නොමැත - main()ශ්‍රිතය ව්‍යංගයෙන් ඉහළ මට්ටමේ ඇති සියලුම කේත වේ.

මෙම අවස්ථාවේ දී, ඉහළ මට්ටමේ කේතය ifඅවහිරයකි. __name__වත්මන් මොඩියුලයේ නමට තක්සේරු කරන බිල්ට් විචල්‍යයකි. කෙසේ වෙතත්, මොඩියුලයක් කෙලින්ම ක්‍රියාත්මක වන්නේ නම් ( myscript.pyඉහත පරිදි), ඒ __name__වෙනුවට නූල් වලට සකසා ඇත "__main__". මේ අනුව, ඔබේ ස්ක්‍රිප්ට් සෘජුවම ක්‍රියාත්මක වන්නේද නැතහොත් වෙනත් දෙයක් මගින් ආනයනය කරන්නේද යන්න පරීක්ෂා කිරීමෙන් ඔබට පරීක්ෂා කළ හැකිය

if __name__ == "__main__":
    ...

ඔබේ ස්ක්‍රිප්ට් වෙනත් මොඩියුලයකට ආනයනය කරන්නේ නම්, එහි විවිධ ක්‍රියාකාරිත්වය සහ පන්ති අර්ථ දැක්වීම් ආනයනය කර එහි ඉහළ මට්ටමේ කේතය ක්‍රියාත්මක කරනු ඇත, නමුත් එවකට ශරීරයේ කේතය if ඉහත වගන්තියේ කොන්දේසියක් ලෙස ක්‍රියාත්මක නොවේ. හමු වී නැත. මූලික උදාහරණයක් ලෙස, පහත පිටපත් දෙක සලකා බලන්න:

# file one.py
def func():
    print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
    print("one.py is being run directly")
else:
    print("one.py is being imported into another module")
# file two.py
import one

print("top-level in two.py")
one.func()

if __name__ == "__main__":
    print("two.py is being run directly")
else:
    print("two.py is being imported into another module")

දැන්, ඔබ පරිවර්තකයා ලෙස ආයාචනා කරන්නේ නම්

python one.py

ප්‍රතිදානය වනු ඇත

top-level in one.py
one.py is being run directly

ඔබ දුවන්නේ නම් two.py ඒ වෙනුවට :

python two.py

ඔබට ලැබෙනවා

top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly

මේ අනුව, මොඩියුලය oneපටවන විට, ඒ වෙනුවට __name__සමාන "one"වේ "__main__".


නියම පිළිතුර, මෙය මගේ මතය අනුව පැහැදිලි පිළිතුර විය. +1!
TheTechRobo36414519

+1 ඒ ගැන සිතන ආකාරය සඳහා: පළමු ඉන්ඩෙන්ට් පේළිය ක්‍රියාත්මක වන්නේ ඔබ එම පළමු පේළියේ කාර්යයන් ක්‍රියාත්මක කරන තුරු පමණි
එලියා මොක්

719

__name__විචල්‍යය සඳහා සරලම පැහැදිලි කිරීම (imho) පහත දැක්වේ:

පහත ලිපිගොනු සාදන්න.

# a.py
import b

හා

# b.py
print "Hello World from %s!" % __name__

if __name__ == '__main__':
    print "Hello World again from %s!" % __name__

ඒවා ක්‍රියාත්මක කිරීමෙන් ඔබට මෙම ප්‍රතිදානය ලැබෙනු ඇත:

$ python a.py
Hello World from b!

ඔබට පෙනෙන පරිදි, මොඩියුලයක් ආනයනය කරන විට, පයිතන් globals()['__name__']මෙම මොඩියුලයේ මොඩියුලයේ නමට සකසයි . එසේම, ආනයනය කිරීමෙන් පසු මොඩියුලයේ ඇති සියලුම කේත ක්‍රියාත්මක වේ. ifප්රකාශය Falseමෙම කොටස සඳහා ඇගයීමට ලක් කරන පරිදි ක්රියාත්මක නොවේ.

$ python b.py
Hello World from __main__!
Hello World again from __main__!

ඔබට පෙනෙන පරිදි, ගොනුවක් ක්‍රියාත්මක වූ විට, පයිතන් globals()['__name__']මෙම ගොනුවේ සකසයි "__main__". මෙවර ifප්‍රකාශය ඇගයීමට ලක් කර Trueක්‍රියාත්මක වෙමින් පවතී.


513

මොකක්ද මේ කරන්නේ if __name__ == "__main__":ද?

මූලික කරුණු ගෙනහැර දැක්වීමට:

  • __name__ඔබගේ වැඩසටහනට ඇතුල් වීමේ ස්ථානය වන මොඩියුලයේ ගෝලීය විචල්‍යය වේ '__main__'. එසේ නොමැතිනම්, ඔබ විසින් මොඩියුලය ආනයනය කරන නම එයයි.

  • එබැවින්, ifබ්ලොක් යටතේ ඇති කේතය ක්‍රියාත්මක වන්නේ මොඩියුලය ඔබේ වැඩසටහනට ඇතුල් වීමේ ස්ථානය නම් පමණි.

  • ආයාතයට යටින් ඇති කේත වාරණය ක්‍රියාත්මක නොකර මොඩියුලයේ කේතය වෙනත් මොඩියුල මගින් ආනයනය කිරීමට එය ඉඩ දෙයි.


අපට මෙය අවශ්‍ය ඇයි?

ඔබේ කේතය සංවර්ධනය කිරීම සහ පරීක්ෂා කිරීම

මොඩියුලයක් ලෙස භාවිතා කිරීමට නිර්මාණය කර ඇති පයිතන් පිටපතක් ඔබ ලියන බව පවසන්න:

def do_important():
    """This function does something very important"""

ශ්‍රිතයේ මෙම ඇමතුම පහළට එකතු කිරීමෙන් ඔබට මොඩියුලය පරීක්ෂා කළ හැකිය :

do_important()

(විධාන විමසුමේදී) වැනි දෙයක් සමඟ එය ක්‍රියාත්මක කරන්න:

~$ python important.py

ගැටලුව වන්නේ

කෙසේ වෙතත්, ඔබට මොඩියුලය වෙනත් ස්ක්‍රිප්ටයකට ආනයනය කිරීමට අවශ්‍ය නම්:

import important

ආනයනය කිරීමේදී, do_importantශ්‍රිතය කැඳවනු ඇත, එබැවින් ඔබ බොහෝ විට ඔබගේ ශ්‍රිත ඇමතුම do_important()පහතින් අදහස් දක්වනු ඇත.

# do_important() # I must remember to uncomment to execute this!

එවිට ඔබ ඔබේ පරීක්ෂණ ක්‍රියාකාරී ඇමතුම ප්‍රකාශ කර ඇත්ද නැද්ද යන්න මතක තබා ගත යුතුය. මෙම අමතර සංකීර්ණතාවයෙන් අදහස් වන්නේ ඔබ අමතක කිරීමට ඉඩ ඇති බැවින් ඔබේ සංවර්ධන ක්‍රියාවලිය වඩාත් කරදරකාරී වන බවයි.

වඩා හොඳ ක්‍රමයක්

එම __name__ සඳහා python භාෂණ මේ මොහොතේ කළ සිදු සෑම තැනක දී ම නාමඅවකාශයකට විචල්ය ලකුණු.

ආනයනික මොඩියුලයක් තුළ, එය එම මොඩියුලයේ නමයි.

නමුත් ප්‍රාථමික මොඩියුලය තුළ (හෝ අන්තර්ක්‍රියාකාරී පයිතන් සැසියක්, එනම් පරිවර්තකයාගේ කියවීම, ඊවාල්, මුද්‍රණ ලූපය හෝ REPL) ඔබ එහි සිට සියල්ල ක්‍රියාත්මක කරයි "__main__".

එබැවින් ක්‍රියාත්මක කිරීමට පෙර ඔබ පරීක්ෂා කරන්නේ නම්:

if __name__ == "__main__":
    do_important()

ඉහත සඳහන් දෑ සමඟ, ඔබේ කේතය ක්‍රියාත්මක වන්නේ ඔබ එය ප්‍රාථමික මොඩියුලය ලෙස ක්‍රියාත්මක කරන විට පමණි (හෝ හිතාමතාම එය වෙනත් ස්ක්‍රිප්ට් එකකින් අමතන්න).

ඊටත් වඩා හොඳ ක්‍රමයක්

මෙය වැඩි දියුණු කිරීම සඳහා පයිතොනික් ක්‍රමයක් ඇත.

මොඩියුලයට පිටතින් මෙම ව්‍යාපාර ක්‍රියාවලිය ක්‍රියාත්මක කිරීමට අපට අවශ්‍ය නම් කුමක් කළ යුතුද?

අප වර්ධනය වන විට ව්‍යායාම කිරීමට අවශ්‍ය කේතය අප විසින් තබන්නේ නම් සහ මේ ආකාරයේ ශ්‍රිතයක් තුළ පරීක්‍ෂා කර '__main__'වහාම අපගේ පරීක්‍ෂණය කරන්න :

def main():
    """business logic for when running this module as the primary one!"""
    setup()
    foo = do_important()
    bar = do_even_more_important(foo)
    for baz in bar:
        do_super_important(baz)
    teardown()

# Here's our payoff idiom!
if __name__ == '__main__':
    main()

අපගේ මොඩියුලයේ අවසානය සඳහා දැන් අපට අවසාන ශ්‍රිතයක් ඇත, එය මොඩියුලය ප්‍රාථමික මොඩියුලය ලෙස ක්‍රියාත්මක කළහොත් ක්‍රියාත්මක වේ.

එය මොඩියුලය හා එහි කටයුතු හා පන්ති පවත්වාගෙන තොරව අනෙකුත් පිටපත් ආනයනය කිරීමට ඉඩ ඇත mainකාර්යය, සහ ද වෙනස් ධාවනය විට මෙම මොඩියුලය (හා එහි කාර්යයන් සහ පංති) නම් කිරීමට ඉඩ ඇත '__main__'මොඩියුලය, එනම්,

import important
important.main()

__main__මොඩියුලය පිළිබඳ පැහැදිලි කිරීමකින් පයිතන් ප්‍රලේඛනය තුළ ද මෙම මෝඩකම සොයාගත හැකිය . එම පා text යේ මෙසේ සඳහන් වේ:

මෙම මොඩියුලය මඟින් පරිවර්තකයාගේ ප්‍රධාන වැඩසටහන ක්‍රියාත්මක කරන (වෙනත් ආකාරයකින් නිර්නාමික) විෂය පථය නිරූපණය කරයි - සම්මත ආදානයෙන්, ස්ක්‍රිප්ට් ගොනුවකින් හෝ අන්තර්ක්‍රියාකාරී විමසුමෙන් කියවන විධානයන්. මුග්ධ “කොන්දේසි සහිත ස්ක්‍රිප්ට්” ගාථාව මඟින් පිටපතක් ක්‍රියාත්මක වීමට හේතු වන්නේ මෙම පරිසරයයි:

if __name__ == '__main__':
    main()

125

if __name__ == "__main__"ස්ක්‍රිප්ට් විධාන රේඛාවෙන් (කියන්න) ක්‍රියාත්මක වන විට ක්‍රියාත්මක වන කොටස වැනි විධානයක් භාවිතා කරයි python myscript.py.


2
helloworld.pyහුදෙක් නැති ගොනුවක් නොමැති විටදී පවා print("hello world")විධාන සමඟ ධාවනය කළ හැක්කේ ඇයි? python helloworld.pyif __name__ == "__main__"
hi15

83

මොකද කරන්නේ if __name__ == "__main__":?

__name__ගෝලීය නාම විචල්‍යයකි (පයිතන්හි, ගෝලීය ඇත්ත වශයෙන්ම මොඩියුල මට්ටමින් අදහස් කරන්නේ ) එය සියලු නාම අවකාශයන්හි පවතී. එය සාමාන්‍යයෙන් මොඩියුලයේ නමයි (a ලෙසstr වර්ගයක් ලෙස).

කෙසේ වෙතත්, එකම විශේෂ අවස්ථාව ලෙස, ඔබ ධාවනය කරන ඕනෑම පයිතන් ක්‍රියාවලියක දී, mycode.py හි මෙන්:

python mycode.py

මෙම එසේ නිර්නාමික ගෝලීය නාමඅවකාශයෙහි වටිනාකම නියම වේ '__main__'එහි __name__.

මේ අනුව, අවසාන රේඛා ඇතුළුව

if __name__ == '__main__':
    main()
  • ඔබගේ mycode.py ස්ක්‍රිප්ට් අවසානයේ,
  • එය පයිතන් ක්‍රියාවලියක් මඟින් ක්‍රියාත්මක වන ප්‍රාථමික, ප්‍රවේශ ලක්ෂ්‍ය මොඩියුලය වන විට,

ඔබගේ ස්ක්‍රිප්ට් අද්විතීය ලෙස අර්ථ දැක්වීමට හේතු වේ main ශ්‍රිතය ක්‍රියාත්මක වීමට හේතු වේ.

මෙම ඉදිකිරීම භාවිතා කිරීමේ තවත් වාසියක්: ඔබට වෙනත් කේත රචනයක මොඩියුලයක් ලෙස ඔබේ කේතය ආනයනය කළ හැකි අතර ඔබේ වැඩසටහන තීරණය කළ විට සහ ප්‍රධාන කාර්යය ක්‍රියාත්මක කළ හැකිය:

import mycode
# ... any amount of other code
mycode.main()

72

ප්‍රශ්නයේ ඇති කේතයේ යාන්ත්‍ර විද්‍යාව වන “කෙසේද” යන්න පිළිබඳව විවිධාකාරයේ කරුණු රාශියක් ඇත, නමුත් “ඇයි” ​​යන්න තේරුම් ගන්නා තෙක් මට ඒ කිසිවක් තේරුණේ නැත. නව ක්‍රමලේඛකයින් සඳහා මෙය විශේෂයෙන් උපකාරී වේ.

"Ab.py" ගොනුව ගන්න:

def a():
    print('A function in ab file');
a()

දෙවන ගොනුව "xy.py":

import ab
def main():
    print('main function: this is where the action is')
def x():
    print ('peripheral task: might be useful in other projects')
x()
if __name__ == "__main__":
    main()

මෙම කේතය ඇත්ත වශයෙන්ම කරන්නේ කුමක්ද?

ඔබ ක්‍රියාත්මක කරන විට xy.py, ඔබ import ab. ආනයන ප්‍රකාශය මොඩියුලය ආනයනය කළ විගසම ක්‍රියාත්මක කරයි, එබැවින් abඉතිරි මෙහෙයුම් වලට පෙර මෙහෙයුම් ක්‍රියාත්මක xyවේ. අවසන් වූ පසු ab, එය දිගටම කරගෙන යයිxy .

කුමන ස්ක්‍රිප්ට් සමඟ ධාවනය වේදැයි පරිවර්තකයා නිරීක්ෂණය කරයි __name__. ඔබ ස්ක්‍රිප්ට් එකක් ධාවනය කරන විට - ඔබ එය නම් කළ දේ කුමක් වුවත් - පරිවර්තකයා එය අමතන්නේ එය "__main__"බාහිර ස්ක්‍රිප්ට් එකක් ධාවනය කිරීමෙන් පසු නැවත ලැබෙන ප්‍රධාන හෝ හෝම් ස්ක්‍රිප්ට් බවට පත් කරමිනි.

මෙම "__main__"ස්ක්‍රිප්ට් එකෙන් කැඳවනු ලබන වෙනත් ඕනෑම ස්ක්‍රිප්ටයකට එහි ගොනු නාමය එහි __name__(උදා. __name__ == "ab.py") ලෙස පවරනු ලැබේ . එබැවින් රේඛාවif __name__ == "__main__": යනු මුලින් ක්‍රියාත්මක කරන ලද 'හෝම්' ස්ක්‍රිප්ට් එක අර්ථ නිරූපණය කරන්නේද / විග්‍රහ කරන්නේද යන්න හෝ එය තාවකාලිකව වෙනත් (බාහිර) පිටපතක් දෙස බලන්නේද යන්න තීරණය කිරීම සඳහා පරිවර්තකයාගේ පරීක්ෂණයයි. මෙමඟින් ස්ක්‍රිප්ටය සෘජුවම එදිරිව එදිරිව ක්‍රියාත්මක වන්නේ නම් එය බාහිරව හැඳින්වේ.

සිදුවන්නේ කුමක්ද යන්න වටහා ගැනීම සඳහා ඉහත කේතය හරහා යමු, පළමුව අවධානය යොමු නොකළ රේඛා සහ ඒවා පිටපත් වල දැක්වෙන අනුපිළිවෙල කෙරෙහි අවධානය යොමු කරමු. එම ශ්‍රිතය මතක තබා ගන්න - හෝ def- කුට්ටි ඔවුන් කැඳවන තුරු තනිවම කිසිවක් නොකරයි. තමාටම පටහැනි නම් පරිවර්තකයා කුමක් කිව හැකිද:

  • Xy.py 'ගෙදර' ගොනුව ලෙස විවෘත කරන්න; එය අමතන්න "__main__"තුළ __name__විචල්ය.
  • ගොනුව ආයාත කර විවෘත කරන්න __name__ == "ab.py".
  • ඔහ්, ශ්‍රිතයක්. මට ඒක මතකයි.
  • හරි, ක්‍රියාකාරිත්වය a(); මම ඒක ඉගෙන ගත්තා. ' අබ් ගොනුවේ ශ්‍රිතයක් ' මුද්‍රණය කිරීම .
  • ගොනුවේ අවසානය; ආපසු "__main__"!
  • ඔහ්, ශ්‍රිතයක්. මට ඒක මතකයි.
  • තවත් එකක්.
  • ක්රියාකාරිත්වය x(); හරි, ' පර්යන්ත කාර්යය: වෙනත් ව්‍යාපෘති සඳහා ප්‍රයෝජනවත් විය හැකිය ' මුද්‍රණය කිරීම .
  • මෙය කුමක් ද? ක ifප්රකාශයක්. හොඳයි, කොන්දේසිය සපුරා ඇත (විචල්‍යය __name__සකසා ඇත "__main__"), එබැවින් මම main()ශ්‍රිතයට ඇතුළු වී ' ප්‍රධාන ශ්‍රිතය: ක්‍රියාව සිදු වන්නේ මෙහිදී ' මුද්‍රණය කරමි .

පහළ පේළි දෙකේ තේරුම: "මෙය "__main__"හෝ 'හෝම්' ස්ක්‍රිප්ට් නම්, නම් කරන ලද ශ්‍රිතය ක්‍රියාත්මක කරන්න main()". def main():ස්ක්‍රිප්ටයේ ක්‍රියාකාරීත්වයේ ප්‍රධාන ප්‍රවාහය අඩංගු බ්ලොක් අප් ටොප් එකක් ඔබට පෙනෙන්නේ එබැවිනි .

මෙය ක්‍රියාත්මක කරන්නේ ඇයි?

ආනයන ප්‍රකාශ ගැන මා කලින් කී දේ මතකද? ඔබ මොඩියුලයක් ආයාත කරන විට එය එය 'හඳුනාගෙන' වැඩිදුර උපදෙස් සඳහා රැඳී නොසිටිනු ඇත - එය සැබවින්ම ස්ක්‍රිප්ට් තුළ ඇති සියලුම ක්‍රියාත්මක කළ හැකි මෙහෙයුම් ක්‍රියාත්මක කරයි. එමනිසා, ඔබේ ස්ක්‍රිප්ටයේ මස් main()ක්‍රියාකාරීත්වයට නිරෝධායනය කර එය හුදකලා කර වෙනත් ස්ක්‍රිප්ට් එකකින් ආනයනය කරන විට එය වහාම ක්‍රියාත්මක නොවනු ඇත.

නැවතත්, ව්යතිරේක පවතී, නමුත් සාමාන්ය පුරුද්ද වන්නේ main()සාමාන්යයෙන් බාහිරව කැඳවීම නොවේ. එබැවින් ඔබ තවත් එක් දෙයක් ගැන කල්පනා කරනවා විය හැකිය: අප අමතන්නේ main()නැත්නම්, අපි තිර රචනය අමතන්නේ ඇයි? එයට හේතුව බොහෝ අය ඔවුන්ගේ ස්ක්‍රිප්ට් ගොනුවේ ඉතිරි කේත වලින් ස්වාධීනව ධාවනය වන පරිදි ගොඩනගා ඇති හුදකලා කාර්යයන් සමඟ සැකසීමයි. පසුව ඒවා පිටපතෙහි වෙනත් තැනකට කැඳවනු ලැබේ. මෙය මා වෙත ගෙන එන්නේ:

නමුත් කේතය එය නොමැතිව ක්රියා කරයි

ඔව් ඒක නිවැරදියි. මෙම වෙනම කාර්යයන් ශ්‍රිතයක් තුළ අඩංගු නොවන පේළියේ ස්ක්‍රිප්ට් එකකින් හැඳින්විය හැකmain() . ඔබ පුරුදු වී සිටින්නේ නම් (මම මෙන්, මගේ මුල් කාලීන ඉගෙනුම් අවධියේදී) ඔබට අවශ්‍ය දේ හරියටම කරන පේළිගත ස්ක්‍රිප්ට් තැනීමට ඔබ පුරුදු වී සිටී නම්, ඔබට නැවත වරක් එම මෙහෙයුම අවශ්‍ය නම් එය නැවත සොයා ගැනීමට උත්සාහ කරනු ඇත .. හොඳයි, ඔබ ඔබේ කේතයට මේ ආකාරයේ අභ්‍යන්තර ව්‍යුහයකට පුරුදු වී නැත, මන්ද එය තැනීමට වඩා සංකීර්ණ වන අතර එය කියවීමට තරම් බුද්ධිමත් නොවේ.

නමුත් එය පිටපතක් ලෙස හැඳින්විය නොහැකි ස්ක්‍රිප්ටයකි, මන්ද එය එසේ වූයේ නම් එය වහාම විචල්‍යයන් ගණනය කිරීම හා පැවරීම ආරම්භ කරනු ඇත. ඔබ ශ්‍රිතයක් නැවත භාවිතා කිරීමට උත්සාහ කරන්නේ නම්, ඔබේ නව ස්ක්‍රිප්ට් එක පරණ එකට සමීපව සම්බන්ධ වන අතර ගැටුම්කාරී විචල්‍යයන් ඇති වේ.

ස්වාධීන කාර්යයන් බෙදීමේදී, ඔබගේ පෙර කෘතිය වෙනත් ස්ක්‍රිප්ට් එකකට කැඳවීමෙන් නැවත භාවිතා කිරීමේ හැකියාව ඔබට ලැබේ. උදාහරණයක් ලෙස, "example.py" "xy.py" ආයාත කර ඇමතුමක් x()ලබා දෙමින් "xy.py" වෙතින් 'x' ශ්‍රිතය භාවිතා කරයි. (සමහර විට එය දී ඇති පෙළ නූලක තුන්වන වචනය ප්‍රාග්ධනීකරණය කිරීම; සංඛ්‍යා ලැයිස්තුවකින් NumPy අරාවක් නිර්මාණය කිරීම සහ ඒවා වර්ග කිරීම; හෝ ත්‍රිමාණ පෘෂ් det යක් බැහැර කිරීම. හැකියාවන් අසීමිත ය.)

(අනෙක් අතට, මෙම ප්‍රශ්නයට ind කින්ඩාල්ගේ පිළිතුරක් අඩංගු වන අතර එය අවසානයේ මට තේරුම් ගැනීමට උපකාර විය - ඇයි, කෙසේද යන්න නොවේ. අවාසනාවකට එය මෙම පිටුවේ අනුපිටපතක් ලෙස සලකුණු කර ඇත , එය වැරැද්දක් යැයි මම සිතමි.)


52

අපගේ මොඩියුලයේ නිශ්චිත ප්‍රකාශයන් ඇති විට ( M.py) එය ප්‍රධාන ලෙස ක්‍රියාත්මක වන විට (ආනයනය නොකෙරේ) ක්‍රියාත්මක කිරීමට අපට අවශ්‍ය නම්, අපට එම ප්‍රකාශ (පරීක්ෂණ අවස්ථා, මුද්‍රණ ප්‍රකාශ) මෙම ifකොටස යටතේ තැබිය හැකිය .

පෙරනිමියෙන් (මොඩියුලය ප්‍රධාන ලෙස ක්‍රියාත්මක වන විට, ආනයනය නොකෙරේ) __name__විචල්‍යය සකසා ඇති "__main__"අතර එය ආනයනය කරන විට __name__විචල්‍යයට වෙනස් අගයක් ලැබෙනු ඇත, බොහෝ විට මොඩියුලයේ නම ( 'M'). මොඩියුලයක විවිධ ප්‍රභේදයන් එකට ධාවනය කිරීමට සහ ඒවායේ නිශ්චිත ආදාන සහ ප්‍රතිදාන ප්‍රකාශ වෙන් කිරීමට සහ පරීක්ෂණ අවස්ථා තිබේ නම් මෙය උපකාරී වේ.

කෙටියෙන් කිවහොත් , if __name__ == "main"මොඩියුලය ආනයනය කරන විට (නිශ්චිත) කේතය ක්‍රියාත්මක වීම වැළැක්වීමට මෙම කොටස භාවිතා කරන්න .


43

සරලව කිවහොත්, __name__ස්ක්‍රිප්ට් ප්‍රධාන මොඩියුලය ලෙස ක්‍රියාත්මක වේද යන්න හෝ එය ආනයනය කරන ලද මොඩියුලයක් ලෙස ක්‍රියාත්මක වේද යන්න නිර්වචනය කරන එක් එක් ස්ක්‍රිප්ට් සඳහා අර්ථ දක්වා ඇති විචල්‍යයකි.

එබැවින් අපට පිටපත් දෙකක් තිබේ නම්;

#script1.py
print "Script 1's name: {}".format(__name__)

හා

#script2.py
import script1
print "Script 2's name: {}".format(__name__)

ස්ක්‍රිප්ට් 1 ක්‍රියාත්මක කිරීමෙන් ලැබෙන ප්‍රතිදානය වේ

Script 1's name: __main__

ස්ක්‍රිප්ට් 2 ක්‍රියාත්මක කිරීමෙන් ලැබෙන ප්‍රතිදානය:

Script1's name is script1
Script 2's name: __main__

ඔබට පෙනෙන පරිදි, __name__ 'ප්‍රධාන' මොඩියුලය කුමන කේතයදැයි අපට කියයි. මෙය විශිෂ්ටයි, මන්ද ඔබට කේතය ලිවිය හැකි අතර සී / සී ++ වැනි ව්‍යුහාත්මක ගැටළු ගැන කරදර විය යුතු නැත, එහිදී, ගොනුවක් 'ප්‍රධාන' ශ්‍රිතයක් ක්‍රියාත්මක නොකරන්නේ නම් එය ක්‍රියාත්මක කළ හැකි එකක් ලෙස සම්පාදනය කළ නොහැකි අතර එසේ වුවහොත්, එය පුස්තකාලයක් ලෙස භාවිතා කළ නොහැක.

ඔබ පයිතන් පිටපතක් ලියන බව පවසන්න, එය විශිෂ්ට දෙයක් කරන අතර ඔබ වෙනත් අරමුණු සඳහා ප්‍රයෝජනවත් වන කාර්යයන් රාශියක් ක්‍රියාත්මක කරයි. මට ඒවා භාවිතා කිරීමට අවශ්‍ය නම් මට ඔබේ ස්ක්‍රිප්ට් ආනයනය කර ඔබේ වැඩසටහන ක්‍රියාත්මක නොකර ඒවා භාවිතා කළ හැකිය (ඔබේ කේතය ක්‍රියාත්මක වන්නේ if __name__ == "__main__":සන්දර්භය තුළ පමණි). සී / සී ++ හි ඔබට එම කොටස් වෙනම මොඩියුලයකට වෙන් කළ යුතු අතර පසුව ගොනුව ඇතුළත් වේ. පහත තත්වය නිරූපණය කරන්න;

සී හි සංකීර්ණ ආනයනය

ඊතල යනු ආනයන සබැඳි ය. මොඩියුල තුනක් සඳහා පෙර මොඩියුල කේතය ඇතුළත් කිරීමට උත්සාහ කරන විට ගොනු හයක් (නවයක්, ක්‍රියාත්මක කිරීමේ ගොනු ගණන් කිරීම) සහ සබැඳි පහක් ඇත. මෙය පුස්තකාලයක් ලෙස සම්පාදනය නොකරන්නේ නම් වෙනත් කේතයක් සී ව්‍යාපෘතියකට ඇතුළත් කිරීම දුෂ්කර කරයි. දැන් එය පයිතන් සඳහා පින්තාරු කරන්න:

පයිතන්හි අලංකාර ආනයනය

ඔබ මොඩියුලයක් ලියන අතර යමෙකුට ඔබේ කේතය භාවිතා කිරීමට අවශ්‍ය නම් ඔවුන් එය ආනයනය කරන අතර __name__විචල්‍යයට වැඩසටහනේ ක්‍රියාත්මක කළ හැකි කොටස පුස්තකාල කොටසෙන් වෙන් කිරීමට උපකාරී වේ.


2
C / C ++ නිදර්ශනය වැරදියි: එකම ඒකක නාමයට වඩා 3 ගුණයක් ( file1 ).
වුල්ෆ්

40

පිළිතුර වඩාත් වියුක්ත ආකාරයකින් බලමු:

අපට මෙම කේතය ඇත්තේ යැයි සිතමු x.py:

...
<Block A>
if __name__ == '__main__':
    <Block B>
...

අපි ධාවනය වන විට A සහ ​​B බ්ලොක් ධාවනය x.pyවේ.

නමුත් හුදෙක් අවහිර A (නො ආ) අප තවත් මොඩියුලය ධාවනය වන විට, ක්රියාත්මක කර ඇත y.pyඋදාහරණයක් ලෙස, වන x.pyආනයනය සහ කේතය (උත්සවයකට විට වැනි වී ගොස් ඇත x.pyසිට ලෙස හැඳින්වේ y.py).


1
මට ලිපිය සංස්කරණය කිරීමට නොහැකි විය (වෙනසක් අවශ්‍ය නම් අවම වශයෙන් අක්ෂර 6 ක්). 14 වන පේළියේ 'x.py' වෙනුවට 'xy' ඇත.
සැමවිටම ඉගෙනීම

35

ඔබ පයිතන් අන්තර්ක්‍රියාකාරීව ධාවනය කරන විට දේශීය __name__විචල්‍යයට අගයක් පවරනු ලැබේ __main__. ඒ හා සමානව, ඔබ වෙනත් මොඩියුලයකට ආනයනය කරනවාට වඩා විධාන රේඛාවෙන් පයිතන් මොඩියුලයක් ක්‍රියාත්මක කරන විට, එහි ගුණාංගයට මොඩියුලයේ නියම නමට වඩා __name__වටිනාකමක් පවරනු ලැබේ __main__. මේ ආකාරයෙන්, මොඩියුලයන් __name__වෙනත් වැඩසටහනකට ආධාරකයක් ලෙස හෝ විධාන රේඛාවෙන් ක්‍රියාත්මක කරන ප්‍රධාන යෙදුම ලෙස ඒවා භාවිතා කරන්නේ කෙසේද යන්න තීරණය කිරීම සඳහා ඔවුන්ගේම වටිනාකම සොයා බැලිය හැකිය . මේ අනුව, පයිතන් මොඩියුලවල පහත දැක්වෙන මෝඩකම බහුලව දක්නට ලැබේ:

if __name__ == '__main__':
    # Do something appropriate here, like calling a
    # main() function defined elsewhere in this module.
    main()
else:
    # Do nothing. This module has been imported by another
    # module that wants to make use of the functions,
    # classes and other useful bits it has defined.

34

සලකා බලන්න:

if __name__ == "__main__":
    main()

__name__පයිතන් පිටපතෙහි ගුණාංගය එය පරික්ෂා කරයි "__main__". වෙනත් වචන වලින් කිවහොත්, වැඩසටහනම ක්‍රියාත්මක වන්නේ නම්, ගුණාංගය වනු ඇත __main__, එබැවින් වැඩසටහන ක්‍රියාත්මක වනු ඇත (මෙම අවස්ථාවේදී main()ශ්‍රිතය).

කෙසේ වෙතත්, ඔබේ පයිතන් ස්ක්‍රිප්ට් මොඩියුලයක් භාවිතා කරන්නේ නම්, ifප්‍රකාශයෙන් පිටත ඕනෑම කේතයක් ක්‍රියාත්මක වනු ඇත, එබැවින් if \__name__ == "\__main__"වැඩසටහන මොඩියුලයක් ලෙස භාවිතා කරන්නේද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා භාවිතා කරයි, එබැවින් කේතය ක්‍රියාත්මක කළ යුතුද යන්න තීරණය කරයි.


දීප්තිමත් පිළිතුර +1 ලිවීමට බොහෝ කාලයක් ගත වී ඇති බව පෙනේ
snr

27

ඒ ගැන කිසිවක් පැහැදිලි කිරීමට පෙර if __name__ == '__main__'එය කුමක්ද __name__සහ එය කරන්නේ කුමක්ද යන්න තේරුම් ගැනීම වැදගත්ය .

කුමක්ද __name__?

__name__යනු DunderAlias - ගෝලීය විචල්‍යයක් ලෙස සිතිය හැකිය (මොඩියුල වලින් ප්‍රවේශ විය හැකිය) සහ ඒ හා සමාන ආකාරයකින් ක්‍රියා කරයි global.

type(__name__)(අස්වැන්න <class 'str'>) මගින් දක්වා ඇති පරිදි එය ( ඉහත සඳහන් කළ පරිදි ගෝලීය) නූලක් වන අතර එය පයිතන් 3 සහ පයිතන් 2 අනුවාදයන් සඳහාම සාදන ලද ප්‍රමිතියකි .

කොහෙද:

එය ස්ක්‍රිප්ට් වල පමණක් නොව පරිවර්තකයා සහ මොඩියුල / පැකේජ යන දෙකෙහිම සොයාගත හැකිය.

පරිවර්ථකයා:

>>> print(__name__)
__main__
>>>

පිටපත:

test_file.py :

print(__name__)

මෙහි ප්රතිඵලයක් ලෙස __main__

මොඩියුලය හෝ පැකේජය:

somefile.py:

def somefunction():
    print(__name__)

test_file.py:

import somefile
somefile.somefunction()

මෙහි ප්රතිඵලයක් ලෙස somefile

පැකේජයක හෝ මොඩියුලයක භාවිතා කරන විට __name__ගොනුවේ නම ගන්නා බව සැලකිල්ලට ගන්න. සත්‍ය මොඩියුලයේ හෝ පැකේජයේ මාවත ලබා දී නැත, නමුත් එයට තමන්ගේම ඩන්ඩර් ඇලියස් ඇත __file__, මේ සඳහා ඉඩ ලබා දේ.

__name__ප්‍රධාන ගොනුව (හෝ වැඩසටහන) කොතැනද , සෑම විටම නැවත පැමිණෙන බවත් __main__, එය මොඩියුලයක් / පැකේජයක් හෝ වෙනත් පයිතන් ස්ක්‍රිප්ට් එකක් අක්‍රිය වන ඕනෑම දෙයක් නම්, ගොනුවේ නම නැවත ලබා දෙන බවත් ඔබ දැක ගත යුතුය. සිට ආරම්භ වී ඇත.

පුහුණුව:

විචල්‍යයක් වීම යනු එහි වටිනාකම නැවත ලිවිය හැකි බවයි ("කළ හැකිය" යන්න "කළ යුතු" යන්නෙන් අදහස් නොකෙරේ), අගය නැවත __name__ලිවීම කියවීමේ හැකියාව අඩු කරයි. එබැවින් කිසිදු හේතුවක් නිසා එය නොකරන්න. ඔබට විචල්‍යයක් අවශ්‍ය නම් නව විචල්‍යයක් අර්ථ දක්වන්න.

සෑම විටම උපකල්පනය කළ යුතු අගය හෝ ගොනුවේ නම __name__යැයි උපකල්පනය කෙරේ __main__. මෙම පෙරනිමි අගය නැවත වරක් වෙනස් කිරීමෙන් එය යහපතක් වනු ඇති බවට තවත් ව්‍යාකූලත්වයක් ඇති කරයි.

උදාහරණයක්:

>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>

if __name__ == '__main__'පිටපත් වලට ඇතුළත් කිරීම පොදුවේ හොඳ පුරුද්දක් ලෙස සැලකේ .

දැන් පිළිතුරු දීමට if __name__ == '__main__':

දැන් අපි දන්නවා __name__දේවල් වල හැසිරීම වඩාත් පැහැදිලි වන බව:

ifලබා දෙන වටිනාකම සැබෑ නම් කේත වාරණ ක්රියාත්මක වනු ඇත අඩංගු බව ප්රවාහය පාලනය කිරීමේ ප්රකාශයක් වේ. එය ආනයනය කර ඇති ගොනුවේ නම හෝ ගොනුවේ නම __name__ගත හැකි බව අපි දැක ඇත්තෙමු __main__.

මෙම නම් එහි අර්ථය වන්නේ __name__කියන්නේ සමාන කිරීමට __main__පසුව ගොනුව පිටපත් ආනයනය මොඩියුල මොඩියුල හෝ පැකේජය ප්රධාන ගොනුව හා සත්ය වශයෙන්ම ක්රියාත්මක කළ යුතු අතර (හෝ එය භාෂණ වේ), නො විය යුතු ය.

ඇත්ත වශයෙන්ම __name__එහි වටිනාකම ගන්නේ __main__නම්, එම කේත කොටසේ ඇති ඕනෑම දෙයක් ක්‍රියාත්මක වේ.

මෙයින් අපට කියැවෙන්නේ ගොනු ධාවනය ප්‍රධාන ගොනුව නම් (හෝ ඔබ පරිවර්තකයාගෙන් කෙලින්ම ධාවනය වන්නේ නම්) එම කොන්දේසිය ක්‍රියාත්මක විය යුතු බවයි. එය පැකේජයක් නම් එය එසේ නොවිය යුතු අතර වටිනාකම එසේ නොවේ __main__.

මොඩියුල:

__name__ මොඩියුලයක නම අර්ථ දැක්වීම සඳහා මොඩියුලවල ද භාවිතා කළ හැකිය

ප්‍රභේද:

වෙනත්, අඩු පොදු නමුත් ප්‍රයෝජනවත් දේ සමඟද කළ හැකිය __name__, සමහර ඒවා මම මෙහි පෙන්වන්නෙමි:

ගොනුව මොඩියුලයක් හෝ පැකේජයක් නම් පමණක් ක්‍රියාත්මක කිරීම:

if __name__ != '__main__':
    # Do some useful things 

ගොනුව ප්‍රධාන එකක් නම් එක් කොන්දේසියක් ක්‍රියාත්මක වන අතර එය එසේ නොවේ නම් තවත් කොන්දේසියක් ක්‍රියාත්මක කිරීම:

if __name__ == '__main__':
    # Execute something
else:
    # Do some useful things

පුස්තකාලවල විස්තීර්ණ භාවිතයකින් තොරව පැකේජ සහ මොඩියුල මත ධාවනය කළ හැකි උපකාරක කාර්යයන් / උපයෝගිතා ලබා දීමටද ඔබට එය භාවිතා කළ හැකිය.

විධාන රේඛාවේ සිට ප්‍රධාන ස්ක්‍රිප්ට් ලෙස මොඩියුල ධාවනය කිරීමට ද එය ඉඩ දෙයි, එය ද ඉතා ප්‍රයෝජනවත් වේ.


25

පිළිතුර ගැඹුරින් හා සරල වචන වලින් බිඳ දැමීම වඩාත් සුදුසු යැයි මම සිතමි:

__name__: පයිතන් හි සෑම මොඩියුලයකම විශේෂ ලක්ෂණයක් __name__ඇත. එය මොඩියුලයේ නම ලබා දෙන බිල්ට් විචල්‍යයකි.

__main__: අනෙකුත් ක්‍රමලේඛන භාෂාවන් මෙන්, පයිතන් ද ක්‍රියාත්මක කිරීමේ ප්‍රවේශ ලක්ෂ්‍යයක් ඇත, එනම් ප්‍රධාන. '__main__' යනු ඉහළ මට්ටමේ කේතය ක්‍රියාත්මක කරන විෂය පථයේ නමයි . මූලික වශයෙන් ඔබට පයිතන් මොඩියුලයක් භාවිතා කිරීමේ ක්‍රම දෙකක් තිබේ: එය කෙලින්ම ස්ක්‍රිප්ට් එකක් ලෙස ධාවනය කරන්න, නැතහොත් ආයාත කරන්න. මොඩියුලයක් ස්ක්‍රිප්ටයක් ලෙස ක්‍රියාත්මක වන විට, එය __name__සකසා ඇත __main__.

මේ අනුව, මොඩියුලය ප්‍රධාන වැඩසටහන ලෙස ක්‍රියාත්මක වන විට __name__ගුණාංගයේ අගය සකසා ඇත __main__. එසේ නොමැතිනම් අගය __name__ මොඩියුලයේ නම අඩංගු වන පරිදි සකසා ඇත.


23

විධාන රේඛාවෙන් පයිතන් ගොනුවක් කැඳවූ විට එය විශේෂ වේ. මෙය සාමාන්‍යයෙන් "ප්‍රධාන ()" ශ්‍රිතයක් ඇමතීමට හෝ වෙනත් සුදුසු ආරම්භක කේතයක් ක්‍රියාත්මක කිරීමට භාවිතා කරයි.

එය ක්‍රම කිහිපයකින් ලිවිය හැකිය. තවත් දෙයක් නම්:

def some_function_for_instance_main():
    dosomething()


__name__ == '__main__' and some_function_for_instance_main()

නිෂ්පාදන කේතයේ ඔබ මෙය භාවිතා කළ යුතු යැයි මම නොකියමි, නමුත් එය "ඉන්ද්‍රජාලික" කිසිවක් නොමැති බව නිදර්ශනය කිරීමට උපකාරී වේ if __name__ == '__main__'. පයිතන් ලිපිගොනු වල ප්‍රධාන කාර්යයක් යෙදීම සඳහා එය හොඳ සම්මුතියකි.


7
ඔබ 1) අතුරු ආබාධ මත යැපීම සහ 2) අපයෝජනය කිරීම නිසා මම මෙම නරක ස්වරූපය සලකා බලමි and. andබූලියන් ප්‍රකාශ දෙකක් සත්‍ය දැයි පරීක්ෂා කිරීම සඳහා භාවිතා කරයි. andප්‍රති the ලය ගැන ඔබ උනන්දුවක් නොදක්වන හෙයින් , ifප්‍රකාශයක් ඔබේ අභිප්‍රායන් වඩාත් පැහැදිලිව සන්නිවේදනය කරයි.
jpmc26

8
ප්‍රවාහ පාලන යාන්ත්‍රණයක් ලෙස බූලියන් ක්‍රියාකරුවන්ගේ කෙටි පරිපථ හැසිරීම සූරාකෑම නරක විලාසිතාවක් ද නැද්ද යන ප්‍රශ්නය පසෙකට දමා, විශාල ගැටළුව වන්නේ මෙය කිසිසේත්ම ප්‍රශ්නයට පිළිතුරු නොදීමයි .
මාර්ක් අමරි

Ark මාක් අමරි හහා, ෂීෂ්, දැන් එය සිදු වේ. Prof
මහාචාර්ය ෆැල්කන් කොන්ත්‍රාත්තුව

19

ප්‍රභව ගොනු (මොඩියුල) සඳහා පද්ධතිය (පයිතන් පරිවර්තක) සපයන විචල්‍යයන් ගණනාවක් තිබේ. ඔබට අවශ්‍ය ඕනෑම වේලාවක ඒවායේ අගයන් ලබා ගත හැකිය, එබැවින්, __name__ විචල්‍යය / ගුණාංගය කෙරෙහි අවධානය යොමු කරමු :

පයිතන් ප්‍රභව කේත ගොනුවක් පටවන විට, එය එහි ඇති සියලුම කේත ක්‍රියාත්මක කරයි. (එය ගොනුවේ අර්ථ දක්වා ඇති සියලුම ක්‍රම සහ කාර්යයන් නොකියන බව සලකන්න, නමුත් එය ඒවා අර්ථ දක්වයි.)

පරිවර්තකයා ප්‍රභව කේත ගොනුව ක්‍රියාත්මක කිරීමට පෙර, එම ගොනුව සඳහා විශේෂ විචල්‍යයන් කිහිපයක් අර්ථ දක්වයි; __name__ යනු එක් එක් ප්‍රභව කේත ගොනුව සඳහා පයිතන් ස්වයංක්‍රීයව නිර්වචනය කරන විශේෂ විචල්‍යයන්ගෙන් එකකි.

පයිතන් මෙම ප්‍රභව කේත ගොනුව ප්‍රධාන වැඩසටහන ලෙස පූරණය කරන්නේ නම් (එනම් ඔබ ධාවනය කරන ගොනුව), එවිට එය මෙම ගොනුව සඳහා විශේෂ __name__ විචල්‍යය "__main__" අගයක් සකසයි .

මෙය වෙනත් මොඩියුලයකින් ආනයනය කරන්නේ නම්, __name__ එම මොඩියුලයේ නමට සකසනු ඇත.

එබැවින්, ඔබේ උදාහරණයේ කොටස:

if __name__ == "__main__":
   lock = thread.allocate_lock()
   thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
   thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))

එයින් අදහස් වන්නේ කේත වාරණය:

lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))

ක්‍රියාත්මක වන්නේ ඔබ මොඩියුලය කෙලින්ම ක්‍රියාත්මක කරන විට පමණි; වෙනත් මොඩියුලයක් ඇමතීමෙන් / ආනයනය කරන්නේ නම් කේත වාරණය ක්‍රියාත්මක නොවේ __name__ එම අවස්ථාවේ දී “ ප්‍රධාන ” ට සමාන නොවන බැවිනි.

මෙය උපකාරී වේ යැයි සිතමි.


17

if __name__ == "__main__": මූලික වශයෙන් ඉහළ මට්ටමේ ස්ක්‍රිප්ට් පරිසරය වන අතර, එය පරිවර්ථකයා නියම කරයි ('පළමුව ක්‍රියාත්මක කිරීමට මට ඉහළම ප්‍රමුඛතාවය ඇත').

'__main__'යනු ඉහළ මට්ටමේ කේතය ක්‍රියාත්මක කරන විෂය පථයේ නමයි. මොඩියුලයක් සම්මත ආදානය, ස්ක්‍රිප්ට් හෝ අන්තර්ක්‍රියාකාරී විමසුමෙන් කියවන විට __name__සමාන වේ '__main__'.

if __name__ == "__main__":
    # Execute only if run as a script
    main()

17

මෙම පිටුවේ ඇති පිළිතුරු පුරාම මම බොහෝ දේ කියවා ඇත්තෙමි. මම කියන්නේ, ඔබ කාරණය දන්නේ නම්, නිසැකවම ඔබට එම පිළිතුරු අවබෝධ වනු ඇත, එසේ නොමැතිනම්, ඔබ තවමත් ව්‍යාකූල වී ඇත.

කෙටියෙන් කිවහොත්, ඔබ කරුණු කිහිපයක් දැන සිටිය යුතුය:

  1. import a ක්‍රියාව ඇත්ත වශයෙන්ම "අ" තුළ ධාවනය කළ හැකි සියල්ල ක්‍රියාත්මක කරයි

  2. 1 වන කරුණ නිසා, ආනයනය කිරීමේදී සියල්ල "අ" තුළ ක්‍රියාත්මක වීමට ඔබට අවශ්‍ය නොවනු ඇත

  3. 2 වන කරුණෙහි ගැටළුව විසඳීම සඳහා, පයිතන් ඔබට කොන්දේසි පරීක්‍ෂණයක් කිරීමට ඉඩ දෙයි

  4. __name__සියලු .pyමොඩියුලවල ව්‍යංග විචල්‍යයකි ; විට a.pyආනයනය කරනු ලබන්නේ වටිනාකම __name__පිළිබඳ a.pyමොඩියුලය "එහි ගොනු නාමය කිරීමට පියවර ගෙන තිබේ a"; විට a.pyභාවිතයෙන් ඍජුවම "ක්රියාත්මක කර ඇත python a.py" යන අර්ථය ඇති a.pyපිවිසුම් ස්ථානය වන අතර, එසේ නම් වටිනාකම __name__පිළිබඳ a.pyමොඩියුලය වැලක් ලෙස සකසා තිබේ__main__

  5. __name__එක් එක් මොඩියුලය සඳහා පයිතන් විචල්‍යය සකසන ආකාරය යාන්ත්‍රණය මත පදනම්ව , 3 වන ලක්ෂ්‍යය සාක්ෂාත් කර ගන්නේ කෙසේදැයි ඔබ දන්නවාද? පිළිතුර තරමක් පහසුයි නේද? If කොන්දේසියක් තබන්න : if __name__ == "__main__": ...; __name__ == "a"ඔබේ ක්‍රියාකාරී අවශ්‍යතාවය අනුව වුවද ඔබට තැබිය හැකිය

පයිතන් විශේෂ වන වැදගත් දෙය වන්නේ 4 වන අවස්ථාවයි! ඉතිරිය මූලික තර්කනය පමණි.


1
ඔව්, 1 වන කරුණ තේරුම් ගැනීමට අත්‍යවශ්‍ය වේ. එතැන් සිට මෙම යාන්ත්‍රණයේ අවශ්‍යතාවය පැහැදිලි වේ.
යුරේකා

16

සලකා බලන්න:

print __name__

ඉහත සඳහා ප්‍රතිදානය වේ __main__.

if __name__ == "__main__":
  print "direct method"

ඉහත ප්‍රකාශය සත්‍ය වන අතර “සෘජු ක්‍රමය” මුද්‍රණය කරයි . ඔවුන් මෙම පංතිය වෙනත් පන්තියකට ආනයනය කළහොත් එය “සෘජු ක්‍රමය” මුද්‍රණය නොකරයි යැයි සිතමු. මන්ද, ආනයනය කරන අතරතුර එය සැකසෙනු ඇත __name__ equal to "first model name".


14

ඔබට ගොනුව ස්ක්‍රිප්ට් එකක් ලෙස මෙන්ම ආනයනය කළ හැකි මොඩියුලයක් ලෙස භාවිතා කළ හැකිය .

fibo.py (මොඩියුලයක් නම් කර ඇත fibo)

# Other modules can IMPORT this MODULE to use the function fib
def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

# This allows the file to be used as a SCRIPT
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

යොමුව: https://docs.python.org/3.5/tutorial/modules.html


14

හේතුව

if __name__ == "__main__":
    main()

මූලික වශයෙන් කේත සෘජුවම ආනයනය කිරීමෙන් ඇතිවිය හැකි ආනයන අගුළු ගැටළු වළක්වා ගැනීමයි . ඔබේ ගොනුව කෙලින්ම ආයාචනා කර ඇත්නම් ඔබට ධාවනය කිරීමට අවශ්‍යය (එයයිmain()__name__ == "__main__" එසේය), නමුත් ඔබේ කේතය ආනයනය කර ඇත්නම් ආනයන අගුළු ගැටළු වළක්වා ගැනීම සඳහා ආනයනකරුට ඔබේ කේතය සත්‍ය ප්‍රධාන මොඩියුලයෙන් ඇතුළත් කළ යුතුය.

අතුරු ආබාධයක් නම්, ඔබ ස්වයංක්‍රීයව බහුවිධ පිවිසුම් ස්ථාන සඳහා සහාය වන ක්‍රමවේදයකට පුරනය වීමයි. main()පිවිසුම් ස්ථානය ලෙස භාවිතා කර ඔබට ඔබේ වැඩසටහන ක්‍රියාත්මක කළ හැකිය , නමුත් ඔබට එසේ කිරීමට අවශ්‍ය නැත . setup.pyඅපේක්ෂා කරන අතරම main(), වෙනත් මෙවලම් විකල්ප පිවිසුම් ස්ථාන භාවිතා කරයි. උදාහරණයක් ලෙස, ඔබේ ගොනුව gunicornක්‍රියාවලියක් ලෙස ක්‍රියාත්මක කිරීම සඳහා, ඔබ app()a වෙනුවට ශ්‍රිතයක් අර්ථ දක්වයි main(). සමඟ පමණක් ලෙස setup.py, gunicornආනයන ඔබගේ කේතය ඔබ එය (නිසා ආනයන අගුලු නිකුත්) ආනයනය කරන වෙනවා අතර, එය කිසිවක් කරන්නේ අවශ්ය නැහැ ඒ නිසා.


3
ආනයන අගුල ගැන ඉගෙන ගැනීමට හොඳයි . [...] තව ටිකක් කොටස් කරන ක්‍රමයකට අත්සන් කිරීම කරුණාකර ඔබට පැහැදිලි කළ හැකිද ?
වුල්ෆ්

1
@ වුල්ෆ්: ෂුවර්. බහුවිධ ප්‍රවේශ ස්ථාන ක්‍රමවේදය ගැන මම වාක්‍ය කිහිපයක් එකතු කර ඇත්තෙමි.
personal_cloud

11

මෙම පිළිතුර පයිතන් ඉගෙන ගන්නා ජාවා ක්‍රමලේඛකයින් සඳහා ය. සෑම ජාවා ගොනුවකම සාමාන්‍යයෙන් එක් පොදු පන්තියක් අඩංගු වේ. ඔබට එම පන්තිය ආකාර දෙකකින් භාවිතා කළ හැකිය:

  1. වෙනත් ලිපිගොනු වලින් පන්තිය අමතන්න. ඔබ එය ඇමතුම් වැඩසටහනට ආනයනය කළ යුතුය.

  2. පරීක්ෂණ අරමුණු සඳහා පන්ති ස්ථාවරය තනිවම ධාවනය කරන්න.

අවසාන අවස්ථාව සඳහා, පන්තියේ පොදු ස්ථිතික අවලංගු ප්‍රධාන () ක්‍රමයක් අඩංගු විය යුතුය. පයිතන් හි මෙම අරමුණු ඉටු කරනු ලබන්නේ ගෝලීයව අර්ථ දක්වා ඇති ලේබලය '__main__'මගිනි.


11

යටතේ ඇති කේතය if __name__ == '__main__': ක්‍රියාත්මක වන්නේ මොඩියුලය ස්ක්‍රිප්ට් එකක් ලෙස ආයාචනා කළහොත් පමණි .

උදාහරණයක් ලෙස පහත මොඩියුලය සලකා බලන්න my_test_module.py:

# my_test_module.py

print('This is going to be printed out, no matter what')

if __name__ == '__main__':
    print('This is going to be printed out, only if user invokes the module as a script')

1 වන හැකියාව: my_test_module.pyවෙනත් මොඩියුලයකින් ආයාත කරන්න

# main.py

import my_test_module

if __name__ == '__main__':
    print('Hello from main.py')

දැන් ඔබ ඉල්ලන්නේ නම් main.py:

python main.py 

>> 'This is going to be printed out, no matter what'
>> 'Hello from main.py'

ක්‍රියාත්මක වන්නේ ඉහළ මට්ටමේ print()ප්‍රකාශයක් පමණක් බව සලකන්න my_test_module.


2 වන හැකියාව: my_test_module.pyපිටපතක් ලෙස ආයාචනා කරන්න

දැන් ඔබ my_test_module.pyපයිතන් පිටපතක් ලෙස ධාවනය කරන්නේ නම්, print()ප්‍රකාශ දෙකම බැහැර කරනු ඇත:

python my_test_module.py

>>> 'This is going to be printed out, no matter what'
>>> 'This is going to be printed out, only if user invokes the module as a script'

10

පයිතන් හි ඇති සෑම මොඩියුලයකම ලක්ෂණයක් __name__ඇත. __name__ ගුණාංගයේ වටිනාකම __main__ මොඩියුලය කෙලින්ම ක්‍රියාත්මක වන විට වැනි ය python my_module.py. එසේ නොමැතිනම් (ඔබ පවසන විට මෙන් import my_module) වටිනාකම __name__ මොඩියුලයේ නම වේ.

කෙටියෙන් පැහැදිලි කිරීමට කුඩා උදාහරණයක්.

#Script test.py

apple = 42

def hello_world():
    print("I am inside hello_world")

if __name__ == "__main__":
    print("Value of __name__ is: ", __name__)
    print("Going to call hello_world")
    hello_world()

අපට මෙය කෙලින්ම ක්‍රියාත්මක කළ හැකිය

python test.py  

ප්‍රතිදානය

Value of __name__ is: __main__
Going to call hello_world
I am inside hello_world

දැන් අපි ඉහත පිටපත වෙනත් ස්ක්‍රිප්ට් වලින් අමතමු යැයි සිතමු

#script external_calling.py

import test
print(test.apple)
test.hello_world()

print(test.__name__)

ඔබ මෙය ක්‍රියාත්මක කරන විට

python external_calling.py

ප්‍රතිදානය

42
I am inside hello_world
test

ඒ නිසා, ඉහත ඔබ පුඩුවක් නම්, ඒ සඳහා වෙනත් තිර රචනය සිට ටෙස්ට් කතා කරන විට ස්වයං පැහැදිලි වේ __name__දී test.pyකැමැත්ත ක්රියාත්මක නොවේ.


6

මෙම .py ගොනුව වෙනත් .py ගොනු මගින් ආනයනය කරන්නේ නම්, "if if ප්‍රකාශය" යටතේ ඇති කේතය ක්‍රියාත්මක නොවේ.

මෙම .py ධාවනය කරන්නේ python this_py.pyෂෙල් යටතේ නම්, නැතහොත් වින්ඩෝස් තුළ දෙවරක් ක්ලික් කරන්න. “if if statement” යටතේ ඇති කේතය ක්‍රියාත්මක වේ.

එය සාමාන්‍යයෙන් පරීක්ෂා කිරීම සඳහා ලියා ඇත.


6

පයිතන් පරිවර්තකය විශේෂිත මොඩියුලයක් ක්‍රියාත්මක කරන්නේ නම් __name__ගෝලීය විචල්‍යයට වටිනාකමක් ඇත"__main__"

  def a():
      print("a")
  def b():
      print("b")

  if __name__ == "__main__": 

          print ("you can see me" )
          a()
  else: 

          print ("You can't see me")
          b()

ඔබ මෙම ස්ක්‍රිප්ට් මුද්‍රණ ධාවනය කරන විට ඔබට මාව දැක ගත හැකිය

ඔබ මෙම ගොනුව ආනයනය කරන්නේ නම් B ගොනු කිරීමට A ගොනුව ක්‍රියාත්මක කර B ගොනුව ක්‍රියාත්මක කරන්න. එවිට if __name__ == "__main__"A ගොනුව අසත්‍ය වේ, එබැවින් එය මුද්‍රණය කරයි ඔබට මාව නොපෙනේ

බී


5

සියලුම පිළිතුරු වල ක්‍රියාකාරිත්වය පැහැදිලි කර ඇත. නමුත් සංකල්පය තවදුරටත් ඉවත් කිරීමට උපකාරී වන එහි භාවිතය පිළිබඳ එක් උදාහරණයක් මම ලබා දෙන්නෙමි.

ඔබට පයිතන් ලිපිගොනු දෙකක් ඇතැයි උපකල්පනය කරන්න, a.py සහ b.py. දැන්, a.py ආනයනය b.py. අපි "ආනයන b.py" කේතය මුලින්ම ක්‍රියාත්මක කරන a.py ගොනුව ක්‍රියාත්මක කරමු. ඉතිරි a.py කේතය ක්‍රියාත්මක වීමට පෙර b.py ගොනුවේ කේතය සම්පූර්ණයෙන්ම ක්‍රියාත්මක විය යුතුය.

B.py කේතයේ එම ගොනුවට පමණක් ආවේණික වූ කේතයක් ඇති අතර b.py ගොනුව ආනයනය කර ඇති වෙනත් ගොනුවක් (b.py ගොනුව හැර) එය ක්‍රියාත්මක කිරීමට අපට අවශ්‍ය නැත.

ඉතින් මේ කේත රේඛාව පරික්ෂා කරන්නේ එයයි. කේතය ධාවනය කරන ප්‍රධාන ගොනුව (එනම්, b.py) නම්, එය එසේ නොවේ නම් (a.py යනු ප්‍රධාන ගොනුව ක්‍රියාත්මක වේ), එවිට ක්‍රියාත්මක වන්නේ කේතය පමණි.


4

ගොනුවක් සාදන්න, a.py :

print(__name__) # It will print out __main__

__name__මෙම __main__ගොනුව ක්‍රියාත්මක වන සෑම විටම මෙය ප්‍රධාන ගොනුව බව පෙන්වයි.

එකම බහලුම තුළ b.py නම් තවත් ගොනුවක් සාදන්න :

import a  # Prints a

එය ක්රියාත්මක කරන්න. එය ආනයනය කරන ගොනුවේ නම a , එනම් මුද්‍රණය කරනු ඇත .

එබැවින්, එකම ගොනුවේ වෙනස් හැසිරීම් දෙකක් පෙන්වීමට , මෙය බහුලව භාවිතා වන උපක්‍රමයකි:

# Code to be run when imported into another python file

if __name__ == '__main__':
    # Code to be run only when run directly

4

නම් නම == ' ප්රධාන ':

අපි __name__ == '__main__':නිතරම දකිනවා .

මොඩියුලයක් ආනයනය කරන්නේද නැද්ද යන්න එය පරීක්ෂා කරයි.

වෙනත් වචන වලින් කිවහොත්, ifබ්ලොක් තුළ ඇති කේතය ක්‍රියාත්මක වන්නේ කේතය කෙලින්ම ක්‍රියාත්මක වන විට පමණි. මෙන්න directlyතේරුම not imported.

මොඩියුලයේ නම මුද්‍රණය කරන සරල කේතයක් භාවිතා කරමින් එය කරන්නේ කුමක්දැයි බලමු:

# test.py
def test():
   print('test module name=%s' %(__name__))

if __name__ == '__main__':
   print('call test()')
   test()

අපි කේතය කෙලින්ම ධාවනය කරන්නේ නම් python test.py, මොඩියුලයේ නම __main__:

call test()
test module name=__main__

4

සරලවම, සී ක්‍රමලේඛන භාෂාවේ mainක්‍රියාකාරිත්වය මෙන් ගොනුව ධාවනය කිරීමේ ප්‍රවේශ ලක්ෂ්‍යය එයයි.


8
මෙම පිළිතුර විශ්රාම වැටුප් (හෝ ඒ හා සමාන ප්රශ්නයක් සමග මොන යම් හෝ පරිශීලකයා) සමග දෙකම හුරු පුරුදු බව උපකල්පනය කරයි සී සහ පිවිසුම් දේ මොකක්ද කියලා ඔහු දන්නවා.
arredond

1
මෙම පිළිතුර if __name__ == "__main__"වාරණයට පෙර කිසිදු කේතයක් (අතුරු ආබාධ නොමැතිව අර්ථ දැක්වීම් හැර) සිදු නොවන බව උපකල්පනය කරයි . තාක්‍ෂණිකව ක්‍රියාත්මක කරන ලද ස්ක්‍රිප්ටයේ ඉහළින්ම ඇත්තේ වැඩසටහනේ පිවිසුම් ස්ථානයයි.
චාලි හාඩිං
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.