+sentinel

    
      
diff --git a/pythonetc/README.md b/pythonetc/README.md
index 27ffb30..45d7ac0 100644
--- a/pythonetc/README.md
+++ b/pythonetc/README.md
@@ -54,3 +54,4 @@ More:
 1. ./dynamic-class-attribute.md (08 October 2020, 18:00)
 1. ./zipapp.md                  (13 October 2020, 18:00)
 1. ./new-init.md                (15 October 2020, 18:00)
+1. ./sentinel.md                (20 October 2020, 18:00)
diff --git a/pythonetc/sentinel.md b/pythonetc/sentinel.md
new file mode 100644
index 0000000..35f7f79
--- /dev/null
+++ b/pythonetc/sentinel.md
@@ -0,0 +1,23 @@
+Some functions can accept as an argument value of any type or no value at all. If you set the default value to `None` you can't say if `None` was explicitly passed or not. For example, the [default value](https://docs.python.org/3/library/argparse.html#default) for [argparse.ArgumentParser.add_argument](https://docs.python.org/3/library/argparse.html#the-add-argument-method). For this purpose, you can create a new object and then use `is` check:
+
+```python
+DEFAULT = object()
+
+def f(arg=DEFAULT):
+  if arg is DEFAULT:
+      return 'no value passed'
+  return f'passed {arg}'
+
+f()     # 'no value passed'
+f(None) # 'passed None'
+f(1)    # 'passed 1'
+f(object()) # 'passed '
+```
+
+The module `unittest.mock` provides a [sentinel](https://docs.python.org/3/library/unittest.mock.html#sentinel) registry to create unique (by name) objects for the testing purpose:
+
+```python
+sentinel.ab.name # 'ab'
+sentinel.ab is sentinel.ab  # True
+sentinel.ab is sentinel.cd  # False
+```