From: Scott on
When creating a function is there any difference between putting
everything under the "def" or not?

Here I created a function called CscoPortNum to convert the network
port number field in a Cisco syslog string from a an ascii name back
into its numeric form if required. Does it matter at all that I
created the translation dictionary first and then started the def?

# def CscoPortNum(RulL)
# Accept a single ACL Rule as a List split into individual words and
# return Port number. Convert from Cisco syslog Port name if required
portfpth = "\\progra~1\\syslogd\\ACL_Logs\\Port-Translations.txt"
# Create dictionary of portnames to portnumbers
portD = {}
for prtnmS in open(portfpth):
prtnmS = prtnmS.rstrip()
spltprtL = prtnmS.split(" ")
portD[spltprtL[2]] = [spltprtL[1]]
def CscoPortNum(RulL):
if "eq" in RulL: # Is the Port listed?
if RulL[RulL.index("eq")+1][0].isdigit(): # Is it numeric?
# if re.search("\d", RulL[RulL.index("eq")+1][0]): # Is it
numeric?
portnum = RulL[RulL.index("eq")+1] # If numeric, use
as is.
else:
# If named, look up numeric translation
portnum = portD[RulL[RulL.index("eq")+1]]
portnum = str(portnum).strip("[]'")
else: portnum = "noeq"
return portnum
From: MRAB on
Scott wrote:
> When creating a function is there any difference between putting
> everything under the "def" or not?
>
> Here I created a function called CscoPortNum to convert the network
> port number field in a Cisco syslog string from a an ascii name back
> into its numeric form if required. Does it matter at all that I
> created the translation dictionary first and then started the def?
>
> # def CscoPortNum(RulL)
> # Accept a single ACL Rule as a List split into individual words and
> # return Port number. Convert from Cisco syslog Port name if required
> portfpth = "\\progra~1\\syslogd\\ACL_Logs\\Port-Translations.txt"
> # Create dictionary of portnames to portnumbers
> portD = {}
> for prtnmS in open(portfpth):
> prtnmS = prtnmS.rstrip()
> spltprtL = prtnmS.split(" ")
> portD[spltprtL[2]] = [spltprtL[1]]
> def CscoPortNum(RulL):
> if "eq" in RulL: # Is the Port listed?
> if RulL[RulL.index("eq")+1][0].isdigit(): # Is it numeric?
> # if re.search("\d", RulL[RulL.index("eq")+1][0]): # Is it
> numeric?
> portnum = RulL[RulL.index("eq")+1] # If numeric, use
> as is.
> else:
> # If named, look up numeric translation
> portnum = portD[RulL[RulL.index("eq")+1]]
> portnum = str(portnum).strip("[]'")
> else: portnum = "noeq"
> return portnum

There's nothing wrong with building dicts or other lookup tables outside
a function in order to avoid re-creating them every time the function is
called.
From: r0g on
Scott wrote:
> When creating a function is there any difference between putting
> everything under the "def" or not?
>
> Here I created a function called CscoPortNum to convert the network
> port number field in a Cisco syslog string from a an ascii name back
> into its numeric form if required. Does it matter at all that I
> created the translation dictionary first and then started the def?
>
> # def CscoPortNum(RulL)
> # Accept a single ACL Rule as a List split into individual words and
> # return Port number. Convert from Cisco syslog Port name if required
> portfpth = "\\progra~1\\syslogd\\ACL_Logs\\Port-Translations.txt"
> # Create dictionary of portnames to portnumbers
> portD = {}
> for prtnmS in open(portfpth):
> prtnmS = prtnmS.rstrip()
> spltprtL = prtnmS.split(" ")
> portD[spltprtL[2]] = [spltprtL[1]]
> def CscoPortNum(RulL):
> if "eq" in RulL: # Is the Port listed?
> if RulL[RulL.index("eq")+1][0].isdigit(): # Is it numeric?
> # if re.search("\d", RulL[RulL.index("eq")+1][0]): # Is it
> numeric?
> portnum = RulL[RulL.index("eq")+1] # If numeric, use
> as is.
> else:
> # If named, look up numeric translation
> portnum = portD[RulL[RulL.index("eq")+1]]
> portnum = str(portnum).strip("[]'")
> else: portnum = "noeq"
> return portnum


In this snippet no, you're not calling the function in the preceding
code so there's no problem. You can intersperse functions with the rest
of your code however you like, they just wont be visible to the
preceding code, but it's better to stick them all at the top of your
script. Even better when you have more than a handful is to bundle
functions into separate py files and then import that file e.g.

---contents of foobar.py-----
def foo():
print "foo"
def bar:
print "bar"

---contents of your main script-----
import foobar
print foo(),bar()

Roger.
From: r0g on
r0g wrote:
> Scott wrote:
>> When creating a function is there any difference between putting
>> everything under the "def" or not?
>>
>> Here I created a function called CscoPortNum to convert the network
>> port number field in a Cisco syslog string from a an ascii name back
>> into its numeric form if required. Does it matter at all that I
>> created the translation dictionary first and then started the def?
>>
>> # def CscoPortNum(RulL)
>> # Accept a single ACL Rule as a List split into individual words and
>> # return Port number. Convert from Cisco syslog Port name if required
>> portfpth = "\\progra~1\\syslogd\\ACL_Logs\\Port-Translations.txt"
>> # Create dictionary of portnames to portnumbers
>> portD = {}
>> for prtnmS in open(portfpth):
>> prtnmS = prtnmS.rstrip()
>> spltprtL = prtnmS.split(" ")
>> portD[spltprtL[2]] = [spltprtL[1]]
>> def CscoPortNum(RulL):
>> if "eq" in RulL: # Is the Port listed?
>> if RulL[RulL.index("eq")+1][0].isdigit(): # Is it numeric?
>> # if re.search("\d", RulL[RulL.index("eq")+1][0]): # Is it
>> numeric?
>> portnum = RulL[RulL.index("eq")+1] # If numeric, use
>> as is.
>> else:
>> # If named, look up numeric translation
>> portnum = portD[RulL[RulL.index("eq")+1]]
>> portnum = str(portnum).strip("[]'")
>> else: portnum = "noeq"
>> return portnum
>
>
> In this snippet no, you're not calling the function in the preceding
> code so there's no problem. You can intersperse functions with the rest
> of your code however you like, they just wont be visible to the
> preceding code, but it's better to stick them all at the top of your
> script. Even better when you have more than a handful is to bundle
> functions into separate py files and then import that file e.g.
>
> ---contents of foobar.py-----
> def foo():
> print "foo"
> def bar:
> print "bar"
>
> ---contents of your main script-----
> import foobar
> print foo(),bar()
>
> Roger.


Whoops, that should have been...

> ---contents of your main script-----
> import foobar
> print foobar.foo(),foobar.bar()

Roger.
>
From: Phlip on
MRAB wrote:

> Scott wrote:

>> for prtnmS in open(portfpth):
>> prtnmS = prtnmS.rstrip()

> There's nothing wrong with building dicts or other lookup tables outside
> a function in order to avoid re-creating them every time the function is
> called.

However, please consider writing complete, pronounceable names for variables.
This looks like Fortran!