පයිතන් වර්ගය පරීක්ෂා කිරීමට කැනොනිකල් ක්‍රමය කුමක්ද?


1306

දී ඇති වස්තුවක් යම් වර්ගයකට අයත් දැයි පරීක්ෂා කිරීමට හොඳම ක්‍රමය කුමක්ද? දී ඇති වර්ගයකින් වස්තුව උරුම වී ඇත්දැයි පරීක්ෂා කරන්නේ කෙසේද?

මට වස්තුවක් ඇතැයි කියමු o. එය එසේ දැයි මා පරීක්ෂා කරන්නේ කෙසේද str?


8
හොඳයි, පයිතන් හි කැනොනිකල් ප්‍රවේශය නම් වර්ගය කිසිසේත් පරීක්ෂා නොකිරීමයි (ඔබ නිදොස්කරණය නොකරන්නේ නම්). සාමාන්‍යයෙන් ඔබ එය නූල් ලෙස භාවිතා කිරීමට උත්සාහ කරයි (උදා: වෙනත් නූල් සමඟ සමපාත වීම, කොන්සෝලය සඳහා මුද්‍රණය කිරීම ආදිය); එය අසාර්ථක විය හැකි යැයි ඔබ සිතන්නේ නම්, උත්සාහ කරන්න / හැර හෝ hasattr භාවිතා කරන්න. එයින් කියැවෙන්නේ පිළිගත් පිළිතුර නම් පයිතන් ලෝකයේ ඔබ සාමාන්‍යයෙන් නොකළ යුතු දේ කිරීමට කැනොනිකල් ක්‍රමයයි. වැඩි විස්තර සඳහා ගූගල් "පයිතන් තාරා ටයිප් කිරීම" හෝ මේවා කියවන්න: voidspace.org.uk/python/articles/duck_typing.shtml stackoverflow.com/questions/610883/…
ජෝන් කුම්බ්ස්

10
මම හිතන්නේ කුම්බ්ස් මහතා JSON නොවන අනුක්‍රමික පන්ති වැනි උදාහරණ නොසලකා හරිනවා. ශ්‍රිතයක් හරහා විශාල දත්ත කැබැල්ලක් තැබුවහොත් (යමෙකුගේ කේතයට බලපෑම් කළ නොහැකි) යමෙකුට එම දත්තවල සමහර කොටස් එය සම්මත කිරීමට පෙර <str> බවට පරිවර්තනය කිරීමට අවශ්‍ය විය හැකිය. අවම වශයෙන් මම මේ පිටුවේ අවසන් වූයේ එලෙසයි ...
ජෝන් කැරල්

2
මෙය ඉල්ලීමට වඩාත්ම පොදු හේතුව වන්නේ යමෙකුට නූල් සහ නූල්වල ක්‍රියාකාරීත්වය අතර වෙනස හඳුනා ගැනීමට අවශ්‍ය වීමයි. මෙය උපක්‍රමශීලී ප්‍රශ්නයකි, මන්ද නූල් යනු නූල් නැවත සැකසිය හැකි ය - තනි අක්ෂර මාලාවක් යනු එහි අනුක්‍රමයකි (අවසන් වරට මා පරීක්ෂා කළ විට - බොහෝ විට ඒ මත විශ්වාසය නොතැබිය යුතුය). නමුත් යමෙකුට කවදා හෝ නූල් වැනි දෙයක් සඳහා භාවිතා කළ හැකිද? ඔව් . එබැවින් "නූල් සහ වෙනත් අනුක්‍රමික නූල් අතර වෙනස හඳුනා ගැනීමට මා කුමක් කළ යුතුද?" නිසියාකාරව: "එය ඔබ කිරීමට උත්සාහ කරන දේ මත රඳා පවතී". :-D
clacke

2
පයිතන් වර්ගයේ විවරණයන් දැන් දෙයක්. මයිපී
ෂීනා

Answers:


1557

නම්, පරීක්ෂා කිරීමට oඇති අවස්ථාව කියන්නේ strහෝ ඕනෑම උපපංතිය str, භාවිතා isinstance (මෙය "කැනෝනිකල්" මාර්ගය වනු ඇත):

if isinstance(o, str):

වර්ගය oහරියටම දැයි පරීක්ෂා කිරීමට str(උප පංති බැහැර කරන්න):

if type(o) is str:

පහත සඳහන් දෑ ද ක්‍රියාත්මක වන අතර සමහර අවස්ථාවල එය ප්‍රයෝජනවත් විය හැකිය:

if issubclass(type(o), str):

අදාළ තොරතුරු සඳහා පයිතන් පුස්තකාල යොමුව තුළ ඇති කාර්යයන් බලන්න .

තවත් එක් සටහනක්: මේ අවස්ථාවේ දී, ඔබ පයිතන් 2 භාවිතා කරන්නේ නම්, ඔබට ඇත්ත වශයෙන්ම භාවිතා කිරීමට අවශ්‍ය විය හැකිය:

if isinstance(o, basestring):

මක්නිසාද යත් මෙය යුනිකෝඩ් නූල් ද අල්ලා ගනු ඇත ( unicodeඋප කාණ්ඩයක් නොවේ str; දෙකම strසහ unicodeඋප පංති වේ basestring). basestringපයිතන් 3 හි තවදුරටත් නොපවතින බව සලකන්න , එහිදී නූල් ( ) සහ ද්විමය දත්ත ( ) දැඩි ලෙස වෙන් කරනු ලැබේ .strbytes

විකල්පයක් ලෙස, isinstanceපන්ති රාශියක් පිළිගනී. ඕනෑම උප පංතියක නිදසුනක් Trueනම් මෙය නැවත පැමිණේ :o(str, unicode)

if isinstance(o, (str, unicode)):

32
str .__ උප පංති __ () මඟින් str හි සෘජු උප පංති පමණක් ලබා දෙන අතර නිකුත් කිරීමේ පන්තිය () හෝ isinstance () ලෙස එකම දේ නොකරයි. (එය සිදු කිරීම සඳහා, ඔබට නැවත නැවත ඇමතිය යුතුය .__ උප පංති __ ()
තෝමස්

16
මෙය හොඳ පිළිතුරකි, නමුත් මම සිතන්නේ එය සාමාන්‍යයෙන් ආරම්භ කළ යුත්තේ ඔබ සාමාන්‍යයෙන් මෙය පයිතන්හි නොකළ යුතු බවට අනතුරු ඇඟවීමකිනි. එය එසේ වන විට, මෙය “පයිතන් හි කළ යුතු කැනොනිකල් දෙයක්” යන උපකල්පනය වලංගු වන බව පෙනේ.
ජෝන් කුම්බ්ස්

4
මේවා python2 පිළිතුරු ය. උදාහරණයක් ලෙස, පයිතන් 3 හි මූලික පදනමක් නොමැත.
dfrankow

4
උදාහරණය සහ "හරියටම" අතර වෙනස කුමක්ද? එසේ type(a) is Objectනොවේ නම් එය ද සත්‍යයකි isinstance(a, Object). කෙසේ වෙතත්, එසේ type(a) is SubClassOfObjectනම් type(a) is Object == False, නමුත් isinstance(a, Object) == True. හරිද?
mavavilj

1
avmavavilj - a is bයන්නෙන් අදහස් කරන්නේ a සහ b යනු එකම දෙයයි, එනම් මතකයේ ඇති එකම වස්තුව ගැන සඳහන් කිරීමයි. එබැවින් aසහ bහරියටම එකම පන්තිය විය යුතුය, උප පංති නොවේ isinstance(). උදාහරණයක් ලෙස stackoverflow.com/a/133024/1072212
ටෙරී බ්‍රවුන්

202

මෙම බොහෝ වස්තුවක වර්ගය පරීක්ෂා කිරීමට Pythonic ක්රමයක් ... එය පරීක්ෂා කිරීමට නොවේ.

පයිතන් තාරා ටයිප් කිරීම දිරිගන්වන බැවින් , ඔබ try...exceptඒවා භාවිතා කිරීමට අවශ්‍ය ආකාරයට වස්තුවේ ක්‍රම භාවිතා කළ යුතුය. එබැවින් ඔබේ ශ්‍රිතය ලිවිය හැකි ගොනු වස්තුවක් සොයන්නේ නම්, එය උප පංතියක් දැයි පරීක්ෂා නොකරන්න , fileඑහි .write()ක්‍රමය භාවිතා කිරීමට උත්සාහ කරන්න !

ඇත්ත වශයෙන්ම, සමහර විට මෙම ලස්සන සාරාංශ බිඳ වැටෙන අතර isinstance(obj, cls)ඔබට අවශ්‍ය වන්නේ එයයි. නමුත් අරපිරිමැස්මෙන් භාවිතා කරන්න.


76
IMHO, වඩාත්ම පයිතොනික් ක්‍රමය වන්නේ ලබා දී ඇති ඕනෑම තර්කයක් සමඟ කටයුතු කිරීමයි. මගේ කේතයේ බොහෝ විට මට වස්තුවක් හෝ වස්තු සමූහයක් ලැබේදැයි දැනගත නොහැකි අතර, එක් වස්තුවක් එක් මූලද්‍රව්‍ය ලැයිස්තුවකට පරිවර්තනය කිරීම සඳහා මම අභ්‍යන්තරව වර්ග පරීක්ෂා කිරීම භාවිතා කරමි.
sastanin

14
ඒ වෙනුවට එහි ලිවීමේ ක්‍රමය භාවිතා කිරීමට උත්සාහ කිරීමෙන් ඔබට ව්‍යතිරේකයක් නොමැතිව මෙය කිරීමට අවශ්‍ය අවස්ථා තිබේ. මෙම අවස්ථාවේදී ඔබට කළ හැකිය ... if hasattr(ob, "write") and callable(ob.write): නැතහොත් යම් ප්‍රවේශයක් සුරකින්න ...func = getattr(ob, "write", None) if callable(func): ...
අදහස්කරු 42

147
තාරා ටයිප් කිරීම යනු පුස්තකාලයක් භාවිතා කිරීමයි. වර්ගය පරීක්ෂා කිරීම යනු පුස්තකාලයක් ලිවීමයි . එකම ගැටළු සහිත වසම නොවේ.
රිකී

17
Ick රිකියා, මම එකඟ නොවෙමි. තාරා ටයිප් කිරීම යනු සුප්‍රසිද්ධ අර්ථකථන සමඟ අතුරුමුහුණත් භාවිතා කරමින් වස්තූන් සමඟ අන්තර්ක්‍රියා කිරීමයි. මෙය පුස්තකාල කේතයට හෝ එවැනි පුස්තකාලයක් භාවිතා කරන කේතයට අදාළ වේ.
ඩෑන් ලෙන්ස්කි

6
y nyuszika7h, Python3 හි ගුණාංග දෝෂයක් hasattrපමණක් යටපත් කරයි - බලන්න: docs.python.org/3.4/library/functions.html#hasattr
ideasman42

58

isinstance(o, str)ආපසු Trueනම් oයනු strහෝ උරුම බව ආකාරයේ වන str.

type(o) is strආපසු Trueඑන්නේ ostr නම් පමණි . උරුම වූ වර්ගයක් Falseනම් එය නැවත පැමිණේ .ostr


6
ඇත්ත වශයෙන්ම, වස්තුව 'str' හි නිදසුනක් නොව, ඒ වෙනුවට නූල් වැනි දෙයක් නම් මෙය අසාර්ථක වනු ඇත. යුනිකෝඩ්, එම්එම්ඒපී, පරිශීලක ස්ට්‍රිං හෝ වෙනත් ඕනෑම පරිශීලක අර්ථ දක්වන ලද වර්ගයක් මෙන්. පයිතන්හි සුපුරුදු ප්‍රවේශය වන්නේ යතුරු ලියනය කිරීම නොවේ.
තෝමස් වවුටර්ස්

7
ඔබට සමාව ගත යුතු නැත, ඔබේම ප්‍රශ්නයට පිළිතුරු දීම හරි. SO යනු කර්මය සඳහා නොව පිළිතුරු සඳහා ය.
එලී බෙන්ඩර්ස්කි

2
මෙය ඉතා ප්රයෝජනවත් වේ. isinstanceසහ අතර වෙනස type(var) == type('')පැහැදිලි නැති නිසා.
sastanin

32

ප්‍රශ්නය අසන ලද සහ පිළිතුරු දුන් පසු, පයිතන්ට ටයිප් ඉඟි එකතු කරන ලදි . පයිතන් හි ඉඟි ටයිප් කර පරීක්ෂා කිරීමට ඉඩ ලබා දෙන නමුත් සංඛ්‍යාත්මකව ටයිප් කළ භාෂාවන්ට වඩා වෙනස් ආකාරයකින්. Python දී ඉඟි කාර්යයන් හා සම්බන්ධ වීමේදී ප්රවේශ දත්ත ලෙස කටයුතු සමග තර්ක කිරීමට අෙප්ක්ෂිත වර්ග ඇසුරු ටයිප් කර මෙම ඉඩ වර්ග පරීක්ෂා කිරීමට සඳහා. ඉඟි වාක්‍ය ඛණ්ඩයේ උදාහරණය:

def foo(i: int):
    return i

foo(5)
foo('oops')

මෙම අවස්ථාවේ දී අපට අවශ්‍ය foo('oops')වන්නේ තර්කයේ විවරණය කළ වර්ගය බැවින් දෝෂයක් අවුලුවාලීමට ය int. ස්ක්‍රිප්ට් සාමාන්‍යයෙන් ක්‍රියාත්මක වන විට එකතු කළ ආකාරයේ ඉඟියක් දෝෂයක් ඇති නොකරයි . කෙසේ වෙතත්, එය වෙනත් වැඩසටහන් විමසීමට සහ වර්ගයේ දෝෂ පරීක්ෂා කිරීමට භාවිතා කළ හැකි අපේක්ෂිත වර්ග විස්තර කරන ශ්‍රිතයට ගුණාංග එකතු කරයි.

වර්ගයේ දෝෂය සොයා ගැනීමට භාවිතා කළ හැකි මෙම වෙනත් වැඩසටහන් වලින් එකක් mypy:

mypy script.py
script.py:12: error: Argument 1 to "foo" has incompatible type "str"; expected "int"

(ඔබට mypyඔබේ පැකේජ කළමණාකරුගෙන් ස්ථාපනය කිරීමට අවශ්‍ය විය හැකිය . එය CPython සමඟ එන බව මම නොසිතමි.

මේ ආකාරයෙන් ටයිප් කිරීම සංඛ්‍යාත්මකව ටයිප් කළ සම්පාදිත භාෂාවලින් ටයිප් කිරීම වඩා වෙනස් වේ. පයිතන් හි වර්ග ගතික බැවින්, සෑම අවස්ථාවකම එය සිදුවිය යුතු යැයි අපි අවධාරනය කරන්නේ නම්, වර්ගය පරීක්ෂා කිරීම ධාවන වේලාවේදී සිදු කළ යුතුය. පැහැදිලි වර්ගයේ චෙක්පත් අවශ්‍යතාවයට වඩා සීමා සහිත වන අතර අනවශ්‍ය දෝෂ ඇති කළ හැකිය (උදා: තර්කය සැබවින්ම හරියටම listවර්ගයට අයත් විය යුතුද? නැතහොත් නැවත ලබා ගත හැකි කිසිවක් ප්‍රමාණවත්ද?).

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

පයිතන් වර්ගයේ ඉඟි යනු වර්ග නියම කර පරීක්ෂා කළ හැකි සම්මුතියක් ඉදිරිපත් කිරීම සඳහා වන නමුත් සුපුරුදු කේත ක්‍රියාත්මක කිරීමේදී අමතර පිරිවැයක් නොමැත.

මෙම typingපැකේජය ඔස්සේ විශේෂයෙන් වර්ග කිරීමකින් තොරව අවශ්ය හැසිරීම් ප්රකාශ කිරීමට වර්ගය ඉඟි භාවිතා කළ හැකි බව විචල්ය ටයිප් කරන්න. නිදසුනක් ලෙස, එම හැසිරීම් සමඟ ඕනෑම වර්ගයක අවශ්‍යතාවය නියම කිරීමට Iterableසහ Callableඉඟි වැනි විචල්‍යයන් එයට ඇතුළත් වේ .

වර්ග පරීක්ෂා කිරීම සඳහා වඩාත්ම පයිතොනික් ක්‍රමය ටයිප් ඉඟි වන අතර, බොහෝ විට ඊටත් වඩා පයිතොනික් වර්ග පරීක්ෂා නොකිරීම සහ තාරා ටයිප් කිරීම මත රඳා සිටීම. ටයිප් ඉඟි සාපේක්ෂව අළුත් ඒවා වන අතර ජූරි සභාව වඩාත් පයිතොනික් විසඳුම වන විට ඒවා තවමත් ක්‍රියාත්මක නොවේ. සාපේක්ෂව මතභේදාත්මක නමුත් සාමාන්‍ය සංසන්දනයක්: ටයිප් ඉඟි මඟින් බලාත්මක කළ හැකි ලියකියවිලි ආකාරයක් සපයයි, කේත ජනනය කිරීමට පෙර සහ දෝෂ තේරුම් ගැනීමට පහසුය, තාරාවන්ගේ යතුරු ලියනය කළ නොහැකි දෝෂ හසු කර ගත හැකි අතර සංඛ්‍යාත්මකව පරීක්ෂා කළ හැකිය (අසාමාන්‍ය ලෙස) හැඟීම නමුත් එය තවමත් ධාවන කාලයෙන් පිටත). අනෙක් අතට, තාරා ටයිප් කිරීම දිගු කලක් තිස්සේ පයිතොනික් ක්‍රමයක් වී ඇති අතර, ස්ථිතික යතුරු ලියනය පිළිබඳ සංජානන පොදු කාර්යයක් නොපෙන්වයි, අඩු වාචික වන අතර, සියලු ශක්‍ය වර්ග සහ පසුව සමහරක් පිළිගනු ඇත.


2
-1: මයිපී විශේෂයෙන් "ස්ථිතික වර්ග පරීක්ෂකයෙක්" ලෙස හඳුන්වයි, එබැවින් ඔබට "වර්ගය පරීක්ෂා කිරීම ධාවන වේලාවේදී කළ යුතුය" යන්න මට විශ්වාස නැත.
කෙවින්

E කෙවින් නැවත සලකා බැලීමේදී එය අනවශ්‍ය ලෙස බැහැර කිරීමකි, නමුත් ඊට වඩා වැඩි යමක් ලබා ගැනීම සඳහා, පයිතන්ගේ වර්ගයේ ඉඟි ධාවන කාල දත්ත බවට හරවන අතර එම දත්ත වලට ප්‍රවේශ වීමට mypyභාවිතා කරන පයිතන් මොඩියුලයකි importlib. මෙය “ස්ථිතික වර්ග පරීක්ෂා කිරීම” දාර්ශනික ප්‍රශ්නයක් වන නමුත් සාමාන්‍ය භාෂා පරිවර්තකයා සහ ආනයන යන්ත්‍රෝපකරණ සම්බන්ධ බැවින් බොහෝ දෙනා අපේක්ෂා කරන දෙයට වඩා එය වෙනස් ය.
Praxeolitic

4
එය ද සත්‍ය නොවේ. එය typed_ast භාවිතා කරයි , එය අතිරේක විශේෂාංග සහිත තාරකා වල ක්ලෝනයක් පමණි . ast මොඩියුල ආනයනය නොකරයි; එය ඒවා වියුක්ත සින්ටැක්ස් ගසකට විග්‍රහ කරයි.
කෙවින්

17

තාරාවන් ටයිප් කිරීම භයානක වන්නේ කවදාදැයි නොදැන නපුරු වීමට හේතුව මෙන්න. නිදසුනක් ලෙස: මෙන්න පයිතන් කේතය (නිසි ලෙස ඇතුල් කිරීම මඟ හැරීම), ඔබට තාරාවෙකු අවශ්‍ය වූ විට ඔබට බෝම්බයක් නොලැබෙන බවට වග බලා ගැනීම සඳහා සමතුලිතතාවය සහ නිකුත් කිරීමේ පන්තියේ කාර්යයන් ගැන සැලකිලිමත් වීමෙන් මෙම තත්වය වළක්වා ගත හැකි බව සලකන්න.

class Bomb:
    def __init__(self):
        ""

    def talk(self):
        self.explode()

    def explode(self):
        print "BOOM!, The bomb explodes."

class Duck:
    def __init__(self):
        ""
    def talk(self):
        print "I am a duck, I will not blow up if you ask me to talk."    

class Kid:
    kids_duck = None

    def __init__(self):
        print "Kid comes around a corner and asks you for money so he could buy a duck."

    def takeDuck(self, duck):
        self.kids_duck = duck
        print "The kid accepts the duck, and happily skips along"

    def doYourThing(self):
        print "The kid tries to get the duck to talk"
        self.kids_duck.talk()

myKid = Kid()
myBomb = Bomb()
myKid.takeDuck(myBomb)
myKid.doYourThing()

36
වර්ගය පරික්ෂා කිරීමෙන් පවා, ඔබට class EvilDuck(Duck)(සහ) අභිබවා යන කතාවක් නිර්මාණය කළ හැකිය . එසේත් නැතිනම්, class ChineseCancerDuck(Duck)වසර ගණනාවකට පසු නොපෙන්වන අතුරු ආබාධයකින්. ඔබේ දරුවා අධීක්ෂණය කිරීම වඩා හොඳ වනු ඇත (සහ ඇගේ සෙල්ලම් බඩු හොඳින් පරීක්ෂා කර බලන්න :)
බ්‍රෙට් තෝමස්

36
බෝම්බ කතා කරන්නේ නැහැ. විකාර ක්‍රම එකතු නොකරන්න, මෙය සිදු නොවේ.
rightfold

7
M දිමිත්‍රි, තාරා ටයිප් කිරීම පිළිබඳ පොදු විවේචනය මෙයයි: en.wikipedia.org/wiki/Duck_typing#Criticism ... ඔබ මූලිකවම කියන්නේ භාෂාවෙන් අර්ථ නිරූපණයන් ක්‍රියාත්මක නොකරන ඕනෑම අතුරු මුහුණතක් නපුරු බවයි. මම විශ්වාස කරන්නේ මෙය ජාවාගේ ප්‍රවේශය වඩා වැඩි බවයි. පයිතන්ගේ තාරා ටයිප් කිරීමේ සමස්ත කරුණ නම් එය ක්‍රියාත්මක වන්නේ නිශ්චිත අතුරුමුහුණත් යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න පිළිබඳව පොදුවේ පිළිගත් සම්මුතියක් ඇති විට පමණි. නිදසුනක් ලෙස, __file__වෙනත් දෙයක් අදහස් කිරීම සඳහා ඔබට ගුණාංගය (ගොනු වැනි වස්තු හඳුනා ගැනීමට බහුලව භාවිතා වේ) අභිබවා යාමෙන් ඔබට පයිතන් කේත විශාල ප්‍රමාණයක් ලබා ගත හැකිය .
ඩෑන් ලෙන්ස්කි

2
මේ සියල්ල පැරණි විහිළුවට පැමිණේ "ඩොක්ටර්, මම මෙය කරන විට එය රිදෙනවා." ... "එහෙනම් එහෙම කරන්න එපා." "එය සම්පාදනය කරන්නේ නම්, එය ක්‍රියාත්මක වේ" යන්නට පුරුදු වී සිටින කෙනෙකුට සෑහීමකට පත්විය නොහැකිය, නමුත් ගතික භාෂා ලෝකයෙන් පරීක්ෂණ උමතුව වර්ධනය වූයේ එබැවිනි.
clacke

1
la ක්ලැක් මූලික වශයෙන්, සෑම දෙයක්ම වස්තුවක් විය යුතුය (නූල් සිට හැකි ඕනෑම වර්ගයකට සිතියම් ගත කිරීම සඳහා), සහ තාරා ටයිප් නොකිරීමට පහසු නිසා, ධාවන වේලාවේදී වර්ග ක්‍රියාත්මක කිරීම දැඩි ලෙස මිල අධිකය. දෘඩ අතුරුමුහුණත් සමඟ සාමාන්‍යයෙන් කිරීම ඉතා අපහසු වේ. ඊට අමතරව, ඕනෑම ස්ථිතික භාෂාවක් ගතික පුස්තකාල, ඇගයීම සහ දැඩි කිරීම හෝ අතුරුමුහුණත් හරහා තාරාවන්ගේ යතුරු ලියනය කිරීම අවශ්‍ය වන ස්ථානයකට මුහුණ දෙන අතර මේ දේවල් සහජයෙන්ම එය නපුරක් නොකරයි, ඉතා බලවත්ය.
දිමිත්‍රි

12

1
මෙම සබැඳිය ප්‍රශ්නයට පිළිතුරු සැපයිය හැකි නමුත්, පිළිතුරේ අත්‍යවශ්‍ය කොටස් මෙහි ඇතුළත් කිරීම සහ යොමු කිරීම සඳහා සබැඳිය සැපයීම වඩා හොඳය. සම්බන්ධිත පිටුව වෙනස් වුවහොත් සම්බන්ධක පමණක් පිළිතුරු වලංගු නොවේ.
EKons

7

මම හිතන්නේ පයිතන් වැනි ගතික භාෂාවක් භාවිතා කිරීමේ සිසිල්ම දෙය නම් ඔබ ඇත්තටම එවැනි දෙයක් පරීක්ෂා කර බැලිය යුතු නැති බවයි.

මම ඔබේ වස්තුවට අවශ්‍ය ක්‍රම අමතා අල්ලා ගන්නෙමි AttributeError. පසුකාලීනව මෙය පරීක්‍ෂා කිරීම සඳහා වස්තුවක් සමච්චල් කිරීම වැනි විවිධ කාර්යයන් ඉටු කිරීම සඳහා වෙනත් (සම්බන්ධයක් නැති) වස්තූන් සමඟ ඔබේ ක්‍රම ඇමතීමට ඉඩ ලබා දේ.

සමග වෙබ් ලකුණු දත්ත ලබා විට මම මේ ගොඩක් භාවිත කර urllib2.urlopen()ඇති නැවත වන වැනි ගොනු වස්තුව. මෙය ගොනුවකින් කියවන ඕනෑම ක්‍රමයකට පාහේ යැවිය හැක, මන්ද එය read()සැබෑ ගොනුවක් ලෙස එකම ක්‍රමය ක්‍රියාත්මක කරන බැවිනි .

නමුත් මට විශ්වාසයි භාවිතා කිරීමට කාලයක් හා ස්ථානයක් ඇති බව isinstance(), එසේ නොමැති නම් එය එහි නොතිබෙනු ඇත :)


ඔබ එය භාවිතා කළ යුත්තේ කවදාද යන්න පිළිබඳ හොඳ උදාහරණයක් නම් ඔබ ගතික json වස්තුවක් විග්‍රහ කරන්නේ නම්. ක්ෂේත්‍රයක් නූලක් හෝ ශබ්ද කෝෂයක් දැයි ඔබ කල්තියා නොදනී.
අළු

6

වඩාත් සංකීර්ණ ආකාරයේ වලංගු කිරීම් සඳහා, පයිතන් වර්ගයේ ඉඟි විවරණයන් මත පදනම්ව වලංගු කිරීමේ යතුරු ලියනයෙහි ප්‍රවේශයට මම කැමතියි :

from typeguard import check_type
from typing import List

try:
    check_type('mylist', [1, 2], List[int])
except TypeError as e:
    print(e)

ඔබට ඉතා පිරිසිදු හා කියවිය හැකි ආකාරයකින් ඉතා සංකීර්ණ වලංගු කිරීම් කළ හැකිය.

check_type('foo', [1, 3.14], List[Union[int, float]])
# vs
isinstance(foo, list) and all(isinstance(a, (int, float)) for a in foo) 

6

වර්ගයක __name__ භාවිතා කරමින් ඔබට විචල්‍ය වර්ගයක් තිබේදැයි පරීක්ෂා කළ හැකිය.

උදා:

>>> a = [1,2,3,4]  
>>> b = 1  
>>> type(a).__name__
'list'
>>> type(a).__name__ == 'list'
True
>>> type(b).__name__ == 'list'
False
>>> type(b).__name__
'int'

ස්තූතියි, මෙය පරිශීලකයාට ප්‍රතිපෝෂණයක් ලෙස පෙන්වන විට මට අවශ්‍ය රහස් කේතයයි. මෙය සොයා ගැනීමට මට බොහෝ කාලයක් ගත විය ...
ආරොන් ඩී. මාරස්කෝ

5

හියුගෝ වෙත:

ඔබ බොහෝ විට අදහස් listවෙනුවට array, නමුත් වර්ග පරික්ෂාව සමග මුළු ගැටලුව ලකුණු බව - ඔබ ප්රශ්නයට වස්තුව ලැයිස්තුවක් නම් දැන ගැනීමට අවශ්ය නැහැ, ඔබ එය අනුක්රමයක් එය තනි වස්තුවක් වේ නම් හෝ යම් ආකාරයක වේ නම් දැන ගැනීමට අවශ්ය. එබැවින් එය අනුක්රමයක් ලෙස භාවිතා කිරීමට උත්සාහ කරන්න.

ඔබට පවතින වස්තුවකට වස්තුව එක් කිරීමට අවශ්‍ය යැයි පවසන්න, නැතහොත් එය වස්තු අනුක්‍රමයක් නම්, ඒ සියල්ල එකතු කරන්න

try:
   my_sequence.extend(o)
except TypeError:
  my_sequence.append(o)

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

මම සාමාන්‍යයෙන් මගේ API නිර්මාණය කිරීමට තෝරා ගන්නේ එය තනි අගයක් හෝ අනුක්‍රමයක් පමණක් පිළිගන්නා හෙයිනි - එය දේවල් පහසු කරයි. එය ක්රියාත්මක කිරීමට අපහසු නොවේ [ ]නම් ඔබට අවශ්ය වේවා එය සමත් විට ඔබේ තනි අගය පමණ.

(මෙය නූල් සමඟ දෝෂ ඇති කළ හැකි වුවද, ඒවා අනුපිළිවෙල මෙන් පෙනේ.)


0

වර්ගය පරීක්ෂා කිරීම සඳහා සරල ක්‍රමයක් නම්, ඔබ දන්නා කෙනෙකු සමඟ එය සංසන්දනය කිරීමයි.

>>> a  = 1
>>> type(a) == type(1)
True
>>> b = 'abc'
>>> type(b) == type('')
True

-1

මම හිතන්නේ හොඳම ක්‍රමය ඔබේ විචල්‍යයන් හොඳින් ටයිප් කිරීමයි. "ටයිප් කිරීමේ" පුස්තකාලය භාවිතා කිරීමෙන් ඔබට මෙය කළ හැකිය.

උදාහරණයක්:

from typing import NewType UserId = NewType ('UserId', int) some_id = UserId (524313) `

Https://docs.python.org/3/library/typing.html බලන්න


-7

ලබා දී ඇති අගය කුමන අක්‍ෂර වර්ගය දැයි පරීක්ෂා කිරීමට ඔබට පහත පේළියෙන් පරීක්ෂා කළ හැකිය:

def chr_type(chrx):
    if chrx.isalpha()==True:
        return 'alpha'
    elif chrx.isdigit()==True:
        return 'numeric'
    else:
        return 'nothing'

chr_type("12)

3
මෙම පිළිතුර මකා දැමීමට ඔබට අවශ්‍ය නැති බව ඔබට විශ්වාසද en වෙන්කතේසන්?
අළු
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.