Словарь функций в Python 2 - PullRequest
0 голосов
/ 04 марта 2019

У меня есть словарь функций.Я хотел бы иметь возможность использовать ту же клавишу для доступа к словарю функций.Есть ли способ сделать это в Python 2?

Это можно закрыть сейчас.Я обнаружил свою ошибку кодирования снизу!

У меня есть существующая программа проверки синтаксиса для набора файлов разметки, разрабатываемых несколькими редакторами.Мы пришли к выводу, что существующие требования к синтаксису не обладают достаточной спецификой для обеспечения единообразия контента между редакторами.Приведенные ниже выдержки из кода относятся к добавлению этих новых требований к этому контролеру.Я НЕ включил ни один из существующих кодов проверки, так как это не относится к использованию словаря функций.Я добавил однострочный комментарий перед каждым разделом, чтобы указать функцию кода.Запуск этой check_routine не «вызывает» желаемую низкоуровневую процедуру: Term_period


class xyz_syntax_checker(object):

# syntax requirements of needed tests for each markdown marker data: LD through SSM

    self.LD_Req = {"LD1" : "Grk",   "LD2" : "NA",   "MSep":"comma", "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"NA"}
    self.WD_Req = {"LD1" : "NA",    "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"NA"}
    self.ST_Req = {"LD1" : "Grk",   "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"NA"}
    self.AS_Req = {"LD1" : "Grk",   "LD2" : "NA",   "MSep":"comma", "Rqd":"NA", "AD1":"semicolon",      "AD2":"NA", "Term":"period"}
    self.PP_Req = {"LD1" : "NA",        "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"NA"}
    self.PO_Req = {"LD1" : "UGG",   "LD2" : "NA",   "MSep":"comma", "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"period"}
    self.IN_Req = {"LD1" :"number",          "LD2" : "NA",  "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"period"}
    self.AL_Req = {"LD1" : "YN",    "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"period"}
    self.ET_Req = {"LD1" : "LL",    "LD2" : "NA",   "MSep":"comma", "Rqd":"colon",      "AD1":"colon",  "AD2":"NA", "Term":"period"}
    self.LX_Req = {"LD1" : "HL",    "LD2" : "CL",   "MSep":"comma", "Rqd":"NA", "AD1":"colon",  "AD2":"semicolon",      "Term":"period"}
    self.TP_Req = {"LD1" : "NA",    "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"period"}
    self.RW_Req = {"LD1" : "LL",    "LD2" : "NA",   "MSep":"comma", "Rqd":"colon",      "AD1":"semicolon",  "AD2":"NA", "Term":"period"}
    self.AN_Req = {"LD1" : "LL",        "LD2" : "NA",   "MSep":"comma", "Rqd":"colon",  "AD1":"semicolon",  "AD2":"NA", "Term":"period"}
    self.SN_Req = {"LD1" : "LL",        "LD2" : "NA",   "MSep":"comma", "Rqd":"colon",      "AD1":"semicolon",  "AD2":"NA", "Term":"period"}
    self.SS_Req       = {"LD1" : "NA",  "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"NA"}
    self.SSM_Req    = {"LD1" : "SSL",   "LD2" : "NA",   "MSep":"NA",    "Rqd":"NA", "AD1":"NA", "AD2":"NA", "Term":"colon"}

# hash table map

    self.All_Req      = {
        "LD":self.LD_Req, 
        "WD":self.WD_Req, 
        "ST":self.ST_Req, 
        "AS":self.AS_Req, 
        "PP":self.PP_Req, 
        "PO":self.PO_Req, 
        "IN":self.IN_Req, 
        "AL":self.AL_Req, 
        "ET":self.ET_Req, 
        "LX":self.LX_Req, 
        "TP":self.TP_Req, 
        "RW":self.RW_Req, 
        "AN":self.AN_Req, 
        "SN":self.SN_Req, 
        "SS":self.SS_Req, 
        "SSM":self.SSM_Req}

# dummy examples of low-level defs that will do the work - only Term_period has content

    def Term_NA (self):  
        return ''

    def Term_colon (self):  
        return ''

    def Term_period (self):  
        if self.Current_Marker == '':
            return ''
        print 'len tmd,cm',len(self.marker_data[self.Current_Marker]),self.Current_Marker
        this_marker_data = self.marker_data[self.Current_Marker].rstrip()
        lastchar = this_marker_data[-1]
        print 'Current marker',self.Current_Marker,'data does not end in a period'
        return ''

# hash table for those low-level defs - f(requirements)

        self.action_mapping = {
                "Term_NA" : self.Term_NA(),
                "Term_colon" : self.Term_colon(),
                "Term_period" : self.Term_period()
        }

# intermediate def to call those - amalgamation of common logic for each call

       def call_action_key(self,this_action):
            self.Action_Key  = this_action + '_' + self.All_Req[self.Current_Marker][this_action]
            print 'ta,AK',this_action,self.Action_Key 
            o = self.action_mapping[self.Action_Key]
            return o

# pseudo top-level def for this new checking/testing

        def checker_routine(self):
            self.Current_Marker = 'PO'
            o = self.call_action_key.get('Term')

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Да, функции являются первоклассными объектами, поэтому их можно использовать для всего, для чего может использоваться объект.

dict_of_functions = {'a': lambda: print('a'),
                     'b': lambda: print('b')}

dict_of_functions['a']()
# 'a'
0 голосов
/ 04 марта 2019

Вы можете попробовать следующий код:

class X():

     def funcA(self):
         return "A"

     def funcB(self):
         return "B"

     def field_map(self,x):
         # Dictionary of Functions
         mapping = {
         "func_A":self.funcA(), 
         "func_B":self.funcB()
         }
        return mapping.get(x,None)


x = X()
z = x.field_map("func_A")
print z # Will print Output of func_A()
z = x.field_map("func_B")
print z # Will print Output of func_B()
z = x.field_map("func_OOB")
print z # Will print None as no function is found

Вывод:

A
B
None

Надеюсь, что это ответ на ваш вопрос !!!

0 голосов
/ 04 марта 2019

Да, функции являются первоклассными объектами в Python.Вы можете либо установить небольшие функции непосредственно в определении словаря с помощью lambda s, либо заранее определить функции и ссылаться на них:

In [56]: def plus3(x):
    ...:     return x+3

In [57]: d = {'plus1': lambda x: x+1, 'plus3': plus3}

In [58]: d['plus1'](10)
Out[58]: 11

In [59]: d['plus3'](20)
Out[59]: 23
...