Skip to content

Commit 76ad868

Browse files
author
Saeid Darvish
committed
l22: complete type hints
1 parent 714e6f7 commit 76ad868

1 file changed

Lines changed: 179 additions & 0 deletions

File tree

lessons/l22.rst

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,186 @@ Class Annotations
292292
ماژول typing
293293
~~~~~~~~~~~~~~~~~~~~~~
294294

295+
این ماژول از نسخه 3.5 با هدف فراهم آوردن پشتیبانی از انواع داده پیچیده‌تر در Runtime پایتون، افزوده شده است [`اسناد پایتون <https://docs.python.org/3/library/typing.html>`__].
295296

297+
برخی از مواردی که این ماژول در پشتیبانی از قابلیت Type Hints فراهم آورده است به شرح زیر است. جهت آشنایی بیشتر می‌توانید به صفحه اصلی مستندات مراجعه نمایید.
298+
299+
300+
**-- معادل برخی از انواع --**
301+
302+
تاکنون فقط به ذکر نوع انواع ساده‌ای همچون ``int`` و ``str`` پرداخته‌ایم، با این حال ذکر نوع برای نوع داده دیکشنری که شامل اعضایی به صورت کلید:مقدار بوده و هر عضو نیز می‌تواند از دو نوع مختلف باشد چگونه باید انجام شود؟ در پاسخ باید گفت که ماژول ``typing`` یک سری انواع معادل فراهم آورده است.
303+
304+
305+
* ``Dict`` [`اسناد پایتون <https://docs.python.org/3/library/typing.html#typing.Dict>`__] معادل ``dict``
306+
307+
::
308+
309+
>>> from typing import Dict
310+
311+
>>> d: Dict[str, int] = {'a': 97, 'b': 98, 'c': 99, 'd': 100}
312+
313+
>>> d
314+
{'a': 97, 'b': 98, 'c': 99, 'd': 100}
315+
>>> type(d)
316+
<class 'dict'>
317+
>>> isinstance(d, dict)
318+
True
319+
320+
321+
::
322+
323+
>>> d = {'a': 97, 'b': 98, 'c': 99, 'd': 100}
324+
325+
326+
327+
* ``List`` [`اسناد پایتون <https://docs.python.org/3/library/typing.html#typing.List>`__] معادل ``list``
328+
329+
::
330+
331+
>>> from typing import List
332+
333+
>>> L: List[int] = [97, 98, 99, 100]
334+
335+
>>> L
336+
[97, 98, 99, 100]
337+
>>> type(L)
338+
<class 'list'>
339+
>>> isinstance(L, list)
340+
True
341+
342+
343+
::
344+
345+
>>> L = [97, 98, 99, 100]
346+
347+
348+
349+
350+
* ``Set`` [`اسناد پایتون <https://docs.python.org/3/library/typing.html#typing.Set>`__] معادل ``set``
351+
352+
::
353+
354+
>>> from typing import Set
355+
356+
>>> s: Set[str] = {'a', 'b', 'c', 'd'}
357+
358+
>>> s
359+
{'d', 'c', 'a', 'b'}
360+
>>> type(s)
361+
<class 'set'>
362+
>>> isinstance(s, set)
363+
True
364+
365+
::
366+
367+
>>> s = {'a', 'b', 'c', 'd'}
368+
369+
370+
|
371+
372+
373+
374+
**-- NewType --**
375+
376+
با استفاده از این تابع می‌توان یک نوع جدید یا درواقع یک Wrapper شخصی برای انواع موجود ایجاد نماییم [`اسناد پایتون <https://docs.python.org/3/library/typing.html#newtype>`__].
377+
378+
379+
سینتکس ``NewType('UserId', int)`` یک نوع جدید با نام ``UserId`` بر اساس نوع اصلی ``int`` ایجاد می‌کند. توجه داشته باشید که نوع جدید تنها از نظر ظاهر برای ابزارهای type checker متفاوت بوده ولی در پایتون همان ماهیت نوع اصلی را خواهد داشت:
380+
381+
::
382+
383+
>>> from typing import NewType
384+
385+
>>> UserId = NewType('UserId', int)
386+
387+
>>> some_id = UserId(524313)
388+
389+
>>> some_id
390+
524313
391+
>>> type(some_id)
392+
<class 'int'>
393+
>>> isinstance(some_id, int)
394+
True
395+
396+
::
397+
398+
>>> def get_user_name(user_id: UserId) -> str:
399+
... if user_id == 1633:
400+
... return 'saeid'
401+
... else:
402+
... return ''
403+
...
404+
>>> saeid_id = UserId(1633)
405+
>>> get_user_name(saeid_id)
406+
'saeid'
407+
408+
|
409+
410+
**-- Any --**
411+
412+
یک نوع خاص که به معنی هر نوعی می‌باشد، در واقع ``Any`` هر نوعی می‌تواند باشد [`اسناد پایتون <https://docs.python.org/3/library/typing.html#the-any-type>`__]. دو قطعه کد زیر از نظر ابزارهای type checker کاملا مشابه یکدیگر هستند:
413+
414+
::
415+
416+
>>> def func(param):
417+
... return param
418+
...
419+
>>>
420+
421+
::
422+
423+
>>> from typing import Any
424+
>>> def func(param: Any) -> Any:
425+
... return param
426+
...
427+
>>> func(4)
428+
4
429+
>>> func('py')
430+
'py'
431+
>>> func([0, 1, 2])
432+
[0, 1, 2]
433+
434+
435+
|
436+
437+
**-- Callable --**
438+
439+
یک نوع خاص دیگر برای شرح نوع یک شی Callable (درس هفدهم) به مانند توابع می‌باشد [`اسناد پایتون <https://docs.python.org/3/library/typing.html#callable>`__]. ساختار این نوع به صورت زیر است:
440+
441+
::
442+
443+
Callable[[Arg1Type, Arg2Type,...], ReturnType]
444+
445+
446+
به مثال زیر توجه تمایید:
447+
448+
.. code-block:: python
449+
:linenos:
450+
451+
from typing import Any, Callable
452+
453+
class Response:
454+
455+
def __init__(self, code:int, message:str, result:Any) -> None:
456+
self.code = code
457+
self.message = message
458+
self.result = result
459+
460+
461+
def success_handler(result:Any) -> None:
462+
pass
463+
464+
465+
def error_handler(code:int, message:str) -> None:
466+
pass
467+
468+
469+
def async_query(on_success: Callable[[Any], None],
470+
on_error: Callable[[int, str], None]) -> Response:
471+
pass
472+
473+
474+
async_query(success_handler, error_handler)
296475
297476
298477

0 commit comments

Comments
 (0)