mirror of
https://github.com/Hizenberg469/Python-tutorial.git
synced 2026-04-19 15:12:22 +03:00
decorators
This commit is contained in:
@@ -1,13 +1,7 @@
|
|||||||
def j(n):
|
def main():
|
||||||
if n == 1:
|
print("This is the main function.")
|
||||||
return 1
|
|
||||||
|
|
||||||
if n % 2 == 0 :
|
|
||||||
return 2 * j(n/2) - 1
|
|
||||||
else:
|
|
||||||
return 2 * j((n-1)/2) + 1
|
|
||||||
|
|
||||||
|
|
||||||
for i in range(1,33):
|
|
||||||
print(f'{i} : {j(i)}')
|
|
||||||
|
|
||||||
|
print('hello world')
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
483
Basic/prog.py
483
Basic/prog.py
@@ -1 +1,482 @@
|
|||||||
print(bool(None))
|
import unittest
|
||||||
|
from netmiko import ConnectHandler
|
||||||
|
from testset import Testset
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
|
globals = None
|
||||||
|
report = unittest.Report()
|
||||||
|
class TRA884_AUTOMATE_103(unittest.SystemTestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(inst):
|
||||||
|
""" Add the initial configuration if any """
|
||||||
|
|
||||||
|
ne1_dict = {
|
||||||
|
'host' : globals.NE1_IP,
|
||||||
|
'http_username' : globals.NE1_httpUsername,
|
||||||
|
'http_password' : globals.NE1_httpPassword,
|
||||||
|
'username' : globals.NE1_userName,
|
||||||
|
'password' : globals.NE1_password,
|
||||||
|
'port' : globals.NE1_socketNo,
|
||||||
|
'device_type' : globals.NE1_productType,
|
||||||
|
'verbose' : True
|
||||||
|
}
|
||||||
|
|
||||||
|
global device_ne1
|
||||||
|
device_ne1 = ConnectHandler(**ne1_dict)
|
||||||
|
|
||||||
|
inst.ne1_uni_ports = [
|
||||||
|
globals.NE1_UNI1.split("#")[0],
|
||||||
|
globals.NE1_UNI2.split("#")[0]
|
||||||
|
]
|
||||||
|
|
||||||
|
inst.ne1_ch1 = inst.ne1_uni_ports[0].split(",")[0]
|
||||||
|
inst.ne1_si1 = inst.ne1_uni_ports[0].split(",")[1]
|
||||||
|
|
||||||
|
inst.ne1_ch2 = inst.ne1_uni_ports[1].split(",")[0]
|
||||||
|
inst.ne1_si2 = inst.ne1_uni_ports[1].split(",")[1]
|
||||||
|
|
||||||
|
inst.port_details = {
|
||||||
|
"NE1" : {
|
||||||
|
'handle' : device_ne1,
|
||||||
|
'uni_ports' : inst.ne1_uni_ports,
|
||||||
|
'ont_ports' : [],
|
||||||
|
'nni_ports' : []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inst.port_details = inst.get_config_details(**inst.port_details)
|
||||||
|
inst.packetRate = int(inst.port_details["packet_rate"])
|
||||||
|
|
||||||
|
inst.ts_ports = [
|
||||||
|
globals.NE1_UNI1.split("#")[1],
|
||||||
|
globals.NE1_UNI2.split("#")[1]
|
||||||
|
]
|
||||||
|
|
||||||
|
ts_dict = {
|
||||||
|
'ip' : globals.L3_Testset_IP,
|
||||||
|
'port_list' : inst.ts_ports
|
||||||
|
}
|
||||||
|
|
||||||
|
global testset
|
||||||
|
testset = Testset.initialize_testset(**ts_dict)
|
||||||
|
testset.reserve()
|
||||||
|
|
||||||
|
inst.tc_details = {
|
||||||
|
'cvlan1' : '230',
|
||||||
|
'evc_name' : 'TRA884_MT_ELAN_EVC_101',
|
||||||
|
'cvlan_fpt_name' : 'TRA884_MT_FPT_101',
|
||||||
|
'total_frames_sent' : '100',
|
||||||
|
'total_frames_received' : '100'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(inst):
|
||||||
|
""" Add the teardown configuration if any """
|
||||||
|
|
||||||
|
print("<b> TearDown </b>")
|
||||||
|
|
||||||
|
device_ne1.tear_down()
|
||||||
|
inst.default_port_switching_params(**inst.port_details)
|
||||||
|
|
||||||
|
for ts_port in inst.ts_ports:
|
||||||
|
testset.ixDeleteDevice(
|
||||||
|
port = ts_port,
|
||||||
|
device_name = 'all'
|
||||||
|
)
|
||||||
|
testset.release()
|
||||||
|
|
||||||
|
device_ne1.disconnect()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"""Add the definitions for tests defined in suite here"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To configure the physical parameters of port.
|
||||||
|
"""
|
||||||
|
def configure_phycl_param_ne1(self, ne1_ch, ne1_si, device_port_ne1, **param_dict):
|
||||||
|
|
||||||
|
port_phycl_param_dict = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, config_value in param_dict.items():
|
||||||
|
port_phycl_param_dict[param] = config_value
|
||||||
|
|
||||||
|
device_ne1.edit_port_physical_parameters(
|
||||||
|
ch = ne1_ch,
|
||||||
|
si = ne1_si,
|
||||||
|
interface = device_port_ne1,
|
||||||
|
**port_phycl_param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def testConfigure_phycl_param_admin_up_ne1(self):
|
||||||
|
|
||||||
|
param_dict = {
|
||||||
|
'admin_status' : 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
device_port1_ne1 = self.ne1_uni_ports[0]
|
||||||
|
device_port2_ne1 = self.ne1_uni_ports[1]
|
||||||
|
|
||||||
|
self.configure_phycl_param_ne1(
|
||||||
|
ne1_ch = self.ne1_ch1,
|
||||||
|
ne1_si = self.ne1_si1,
|
||||||
|
device_port_ne1 = device_port1_ne1,
|
||||||
|
**param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
self.configure_phycl_param_ne1(
|
||||||
|
ne1_ch = self.ne1_ch2,
|
||||||
|
ne1_si = self.ne1_si2,
|
||||||
|
device_port_ne1 = device_port2_ne1,
|
||||||
|
**param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def testConfigure_phycl_param_admin_down_ne1(self):
|
||||||
|
|
||||||
|
param_dict = {
|
||||||
|
'admin_status' : 'disable',
|
||||||
|
}
|
||||||
|
|
||||||
|
device_port1_ne1 = self.ne1_uni_ports[0]
|
||||||
|
device_port2_ne1 = self.ne1_uni_ports[1]
|
||||||
|
|
||||||
|
self.configure_phycl_param_ne1(
|
||||||
|
ne1_ch = self.ne1_ch1,
|
||||||
|
ne1_si = self.ne1_si1,
|
||||||
|
device_port_ne1 = device_port1_ne1,
|
||||||
|
**param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
self.configure_phycl_param_ne1(
|
||||||
|
ne1_ch = self.ne1_ch2,
|
||||||
|
ne1_si = self.ne1_si2,
|
||||||
|
device_port_ne1 = device_port2_ne1,
|
||||||
|
**param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To configure the switching parameters of port.
|
||||||
|
"""
|
||||||
|
def configure_switch_param_ne1(self, ne1_ch, ne1_si, intf_type, interface, **param_dict):
|
||||||
|
|
||||||
|
self.intf_type = intf_type
|
||||||
|
self.interface = interface
|
||||||
|
port_switch_param_dict = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, config_value in param_dict.items():
|
||||||
|
port_switch_param_dict[param] = config_value
|
||||||
|
|
||||||
|
device_ne1.edit_port_switching_params(
|
||||||
|
ch = ne1_ch,
|
||||||
|
si = ne1_si,
|
||||||
|
intf_type = self.intf_type,
|
||||||
|
interface = self.interface,
|
||||||
|
**port_switch_param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
def testConfigure_switch_param_case1_ne1(self):
|
||||||
|
|
||||||
|
param_dict = {
|
||||||
|
'port_type' : 'dot1q',
|
||||||
|
'port_mode' : 'regular',
|
||||||
|
'pvid' : '230',
|
||||||
|
'pvid_egress_untag' : 'disable',
|
||||||
|
'acceptable_frame_policy' : 'acceptall',
|
||||||
|
'fpcr_priority_source' : 'vlan_only'
|
||||||
|
}
|
||||||
|
|
||||||
|
device_port1_ne1 = self.ne1_uni_ports[0]
|
||||||
|
device_port2_ne1 = self.ne1_uni_ports[1]
|
||||||
|
|
||||||
|
self.configure_switch_param_ne1(
|
||||||
|
ne1_ch = self.ne1_ch1,
|
||||||
|
ne1_si = self.ne1_si1,
|
||||||
|
intf_type = 'interface',
|
||||||
|
interface = device_port1_ne1,
|
||||||
|
**param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
self.configure_switch_param_ne1(
|
||||||
|
ne1_ch = self.ne1_ch2,
|
||||||
|
ne1_si = self.ne1_si2,
|
||||||
|
intf_type = 'interface',
|
||||||
|
interface = device_port2_ne1,
|
||||||
|
**param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To create evc ( of type eline or elan).
|
||||||
|
"""
|
||||||
|
def create_evc_ne1(self, ne1_ch, ne1_si, evc_name, evc_type, forwarding_type, unknown_multicast_action, customer_name, **param_dict):
|
||||||
|
|
||||||
|
evc_param_dict = {
|
||||||
|
'admin_status' : 'up',
|
||||||
|
'evc_mode' : 'regular',
|
||||||
|
'trail_identifier' : '0',
|
||||||
|
'mvr' : 'disable',
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, config_value in param_dict.items():
|
||||||
|
evc_param_dict[param] = config_value
|
||||||
|
|
||||||
|
device_ne1.create_evc(
|
||||||
|
ch = ne1_ch,
|
||||||
|
si = ne1_si,
|
||||||
|
evc_name = evc_name,
|
||||||
|
evc_type = evc_type,
|
||||||
|
forwarding_type = forwarding_type,
|
||||||
|
unknown_multicast_action = unknown_multicast_action,
|
||||||
|
customer_name = customer_name,
|
||||||
|
**evc_param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def testCreate_elan_evc_case1_ne1(self):
|
||||||
|
self.create_evc_ne1(
|
||||||
|
ne1_ch = self.ne1_ch1,
|
||||||
|
ne1_si = self.ne1_si1,
|
||||||
|
evc_name = 'TRA884_MT_ELAN_EVC_101',
|
||||||
|
evc_type = 'elan',
|
||||||
|
forwarding_type = 'cvlan',
|
||||||
|
unknown_multicast_action = 'drop',
|
||||||
|
customer_name = 'tejas'
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To create Flowpoint template.
|
||||||
|
"""
|
||||||
|
def create_fpt_ne1(self, ne1_ch, ne1_si, fpt_name, fpt_type, **param_dict):
|
||||||
|
|
||||||
|
fpt_param_dict = {
|
||||||
|
'delete_if_exists' : True,
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, config_value in param_dict.items():
|
||||||
|
fpt_param_dict[param] = config_value
|
||||||
|
|
||||||
|
device_ne1.create_fpt(
|
||||||
|
ch = ne1_ch,
|
||||||
|
si = ne1_si,
|
||||||
|
fpt_name = fpt_name,
|
||||||
|
fpt_type = fpt_type,
|
||||||
|
**fpt_param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
def testCreate_fpt_case1_ne1(self):
|
||||||
|
|
||||||
|
fpt_config_dict = {
|
||||||
|
'cvlan_low' : '200',
|
||||||
|
'cvlan_high' : '300'
|
||||||
|
}
|
||||||
|
|
||||||
|
self.create_fpt_ne1(
|
||||||
|
ne1_ch = self.ne1_ch1,
|
||||||
|
ne1_si = self.ne1_si1,
|
||||||
|
fpt_name = 'TRA884_MT_FPT_101',
|
||||||
|
fpt_type = 'cvlan',
|
||||||
|
**fpt_config_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To create Flowpoint.
|
||||||
|
"""
|
||||||
|
def create_flowpoint_ne1(self, ne1_ch, ne1_si, evc_name, intf_type, interface, fpt_name, fp_mode, **param_dict):
|
||||||
|
|
||||||
|
fp_param_dict = {
|
||||||
|
'traffic_type' : 'data',
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, config_value in param_dict.items():
|
||||||
|
fp_param_dict[param] = config_value
|
||||||
|
|
||||||
|
device_ne1.create_flowpoint(
|
||||||
|
ch = ne1_ch,
|
||||||
|
si = ne1_si,
|
||||||
|
evc_name = evc_name,
|
||||||
|
intf_type = intf_type,
|
||||||
|
interface = interface,
|
||||||
|
fpt_name = fpt_name,
|
||||||
|
fp_mode = fp_mode,
|
||||||
|
**fp_param_dict
|
||||||
|
)
|
||||||
|
|
||||||
|
def testCreate_flowpoint_case1_ne1(self):
|
||||||
|
self.create_flowpoint_ne1(
|
||||||
|
ne1_ch = self.ne1_ch1,
|
||||||
|
ne1_si = self.ne1_si1,
|
||||||
|
evc_name = 'TRA884_MT_ELAN_EVC_101',
|
||||||
|
intf_type = 'interface',
|
||||||
|
interface = self.ne1_uni_ports[0],
|
||||||
|
fpt_name = 'TRA884_MT_FPT_101',
|
||||||
|
fp_mode = 'dot1q'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.create_flowpoint_ne1(
|
||||||
|
ne1_ch = self.ne1_ch2,
|
||||||
|
ne1_si = self.ne1_si2,
|
||||||
|
evc_name = 'TRA884_MT_ELAN_EVC_101',
|
||||||
|
intf_type = 'interface',
|
||||||
|
interface = self.ne1_uni_ports[1],
|
||||||
|
fpt_name = 'TRA884_MT_FPT_101',
|
||||||
|
fp_mode = 'dot1q'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To configure a RAW stream block.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def configure_rw_stream_block_TS1(self, stream_id):
|
||||||
|
|
||||||
|
port = self.ts_ports[0]
|
||||||
|
req_dict = {
|
||||||
|
'port' : port,
|
||||||
|
'streamID' : str(stream_id),
|
||||||
|
'FrameLengthMode' : 'fixedSize',
|
||||||
|
'FrameSize' : '1000',
|
||||||
|
'DurationMode' : 'Bursts',
|
||||||
|
'Duration' : self.tc_details['total_frames_sent']
|
||||||
|
}
|
||||||
|
|
||||||
|
testset.ixConfStreamBlock(**req_dict)
|
||||||
|
testset.save_testset_config()
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To configure a single vlan tagged frame.
|
||||||
|
"""
|
||||||
|
def configure_traffic_single_tagged_TS1(self, spirent_port, streamID,**param_dict):
|
||||||
|
self.configure_rw_stream_block_TS1(streamID)
|
||||||
|
|
||||||
|
frame_config_param_dict = {
|
||||||
|
'port' : spirent_port,
|
||||||
|
'streamID' : str(streamID),
|
||||||
|
'dstMAC' : '00:ce:00:01:02:03',
|
||||||
|
'srcMAC' : '00:ab:01:00:00:02',
|
||||||
|
'etherType' : '88b5',
|
||||||
|
'cvid' : '256',
|
||||||
|
}
|
||||||
|
|
||||||
|
for param, config_value in param_dict:
|
||||||
|
frame_config_param_dict[param] = config_value
|
||||||
|
|
||||||
|
testset.ixConfDot1ADFrame(**frame_config_param_dict)
|
||||||
|
|
||||||
|
|
||||||
|
def testConfigure_traffic_single_tagged_case1_TS1(self):
|
||||||
|
|
||||||
|
sp_port = self.ts_ports[0]
|
||||||
|
streamId = 1
|
||||||
|
|
||||||
|
self.configure_traffic_single_tagged_TS1(
|
||||||
|
spirent_port = sp_port,
|
||||||
|
streamID = streamId
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To check one or more fields from captured packet.
|
||||||
|
"""
|
||||||
|
def testValidate_traffic_TS1_to_TS2(self):
|
||||||
|
testset.ixCheckStreamParams(
|
||||||
|
txPort = self.ts_ports[0],
|
||||||
|
rxPort = self.ts_ports[1],
|
||||||
|
paramList = ['FrameCount'],
|
||||||
|
streamID = str(1)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To start the traffic on the ports.
|
||||||
|
"""
|
||||||
|
def testStart_traffic_TS1(self):
|
||||||
|
testset.ixStartTraffic(
|
||||||
|
portList = [self.ts_ports[0], self.ts_ports[1]],
|
||||||
|
clearStats = True
|
||||||
|
)
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Function description:
|
||||||
|
Uses:
|
||||||
|
To start the capturing packets on port.
|
||||||
|
"""
|
||||||
|
def testStart_capture_TS2(self):
|
||||||
|
testset.ixStartStopPacketCapture(
|
||||||
|
portList = [self.ts_ports[1]],
|
||||||
|
capture = 'start'
|
||||||
|
)
|
||||||
|
|
||||||
|
def testStop_capture_TS2(self):
|
||||||
|
time.sleep(10)
|
||||||
|
testset.ixStartStopPacketCapture(
|
||||||
|
portList = [self.ts_ports[1]],
|
||||||
|
capture = 'stop'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def testCheck_single_tagged_packet_TS1_to_TS_2(self):
|
||||||
|
|
||||||
|
param_dict = {
|
||||||
|
'txPortList' : [self.ts_ports[0]],
|
||||||
|
'rxPortList' : [self.ts_ports[1]],
|
||||||
|
'filter' : 'eth.src==00:ab:01:00:00:02',
|
||||||
|
'checkRxVID' : self.tc_details['cvlan1'],
|
||||||
|
'checkEthType' : '88 b5',
|
||||||
|
'checkRxFrames' : self.tc_details['total_frames_received']
|
||||||
|
}
|
||||||
|
|
||||||
|
testset.ixCheckTrafficSanity(**param_dict)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def suite():
|
||||||
|
suite = unittest.TestSuite()
|
||||||
|
"""Add your tests into the suite here"""
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testConfigure_phycl_param_admin_down_ne1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testConfigure_phycl_param_admin_up_ne1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testConfigure_switch_param_case1_ne1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testCreate_elan_evc_case1_ne1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testCreate_fpt_case1_ne1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testCreate_flowpoint_case1_ne1"))
|
||||||
|
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testConfigure_traffic_single_tagged_case1_TS1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testStart_capture_TS2"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testStart_traffic_TS1"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testStop_capture_TS2"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testValidate_traffic_TS1_to_TS2"))
|
||||||
|
suite.addTest(TRA884_AUTOMATE_103("testCheck_single_tagged_packet_TS1_to_TS_2"))
|
||||||
|
|
||||||
|
return suite
|
||||||
|
|
||||||
|
def main():
|
||||||
|
runner = unittest.TextTestRunner()
|
||||||
|
return runner.run(suite())
|
||||||
|
|||||||
@@ -87,6 +87,16 @@
|
|||||||
|
|
||||||
list are mutable but tuple are immutable
|
list are mutable but tuple are immutable
|
||||||
|
|
||||||
|
-> set:
|
||||||
|
|
||||||
|
set is a unordered collection of unique objects.
|
||||||
|
|
||||||
|
for ex:
|
||||||
|
my_set = { 1,2,3,4,5,5 }
|
||||||
|
my_set.add(100)
|
||||||
|
my_set.add(2)
|
||||||
|
print(my_set)
|
||||||
|
|
||||||
-> using keyword and using methods:
|
-> using keyword and using methods:
|
||||||
|
|
||||||
using keyword to access anything which may not exist
|
using keyword to access anything which may not exist
|
||||||
|
|||||||
20
decorators/decorator.py
Normal file
20
decorators/decorator.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#decorator
|
||||||
|
def my_decorator(func):
|
||||||
|
|
||||||
|
def wrap_func():
|
||||||
|
print('************')
|
||||||
|
func()
|
||||||
|
print('************')
|
||||||
|
|
||||||
|
return wrap_func
|
||||||
|
|
||||||
|
@my_decorator
|
||||||
|
def hello():
|
||||||
|
print('hellllooooooooooo')
|
||||||
|
|
||||||
|
@my_decorator
|
||||||
|
def bye():
|
||||||
|
print('see ya letter')
|
||||||
|
|
||||||
|
hello()
|
||||||
|
bye()
|
||||||
111
decorators/wiki.txt
Normal file
111
decorators/wiki.txt
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
-> Functions:
|
||||||
|
|
||||||
|
functions in python are first class citizen,
|
||||||
|
i.e. they can be passed around as variables.
|
||||||
|
|
||||||
|
for ex:
|
||||||
|
|
||||||
|
def hello():
|
||||||
|
print('hello')
|
||||||
|
|
||||||
|
greet = hello
|
||||||
|
del hello
|
||||||
|
print(greet())
|
||||||
|
|
||||||
|
Here in this example, the hello function is defined
|
||||||
|
and assigned to newly defined variable called greet.
|
||||||
|
Then the function name hello is deleted using del
|
||||||
|
keyword.
|
||||||
|
|
||||||
|
Here, the "del hello" is called, only the name of the
|
||||||
|
function i.e. hello is deleted instead of deleting
|
||||||
|
the function. This is due to the "greet" variable
|
||||||
|
which is still pointing the function location.
|
||||||
|
Hence, calling the function using greet function
|
||||||
|
name works but calling the function with hello
|
||||||
|
name will throw error as the hello variable is
|
||||||
|
deleted.
|
||||||
|
|
||||||
|
-> High Order function:
|
||||||
|
|
||||||
|
function which might return a function or take a function
|
||||||
|
as an argument.
|
||||||
|
|
||||||
|
for ex:
|
||||||
|
|
||||||
|
def greet(func):
|
||||||
|
func()
|
||||||
|
|
||||||
|
def greet2():
|
||||||
|
def func():
|
||||||
|
return 5
|
||||||
|
|
||||||
|
return func
|
||||||
|
|
||||||
|
-> decorators:
|
||||||
|
|
||||||
|
These are used to super boost our function:
|
||||||
|
|
||||||
|
for ex:
|
||||||
|
|
||||||
|
#decorator
|
||||||
|
def my_decorator(func):
|
||||||
|
|
||||||
|
def wrap_func():
|
||||||
|
print('************')
|
||||||
|
func()
|
||||||
|
print('************')
|
||||||
|
|
||||||
|
return wrap_func
|
||||||
|
|
||||||
|
@my_decorator
|
||||||
|
def hello():
|
||||||
|
print('hellllooooooooooo')
|
||||||
|
|
||||||
|
def bye():
|
||||||
|
print('see ya letter')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Here, if we our function powerful by using decorators.
|
||||||
|
if we use @<decorator-name> and define the function,
|
||||||
|
during the function call the decorator function will
|
||||||
|
take our function as an argument and inside the
|
||||||
|
decorator function it will call the passed function
|
||||||
|
inside wrapped function.
|
||||||
|
|
||||||
|
|
||||||
|
For using decorators we need to write the decorator
|
||||||
|
function in way as written above.
|
||||||
|
|
||||||
|
|
||||||
|
But, how it works under the hood?
|
||||||
|
|
||||||
|
This function defination with decorator is same as
|
||||||
|
|
||||||
|
@my_decorator
|
||||||
|
def hello():
|
||||||
|
print('helloooo')
|
||||||
|
|
||||||
|
var = my_decorator(hello)
|
||||||
|
var()
|
||||||
|
|
||||||
|
|
||||||
|
-> decorator with function having arguments:
|
||||||
|
|
||||||
|
|
||||||
|
for ex:
|
||||||
|
def my_decorator(func):
|
||||||
|
def wrap_func(*args, **kwargs):
|
||||||
|
func(*args, **kwargs)
|
||||||
|
|
||||||
|
return wrap_func
|
||||||
|
|
||||||
|
@my_decorator
|
||||||
|
def hello(greeting, emoji = ':('):
|
||||||
|
print(greeting, emoji)
|
||||||
|
|
||||||
|
hello('hii')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user