簡體   English   中英

如何循環列表以將字符串傳遞給python中的函數名稱

[英]how to loop list to pass string to function name in python

我試圖找到最有效的方法來創建具有稍微不同的代碼(輸入文件名'app / data / mydata_a.csv' )的不同函數名稱myfunction_a ,.. b,c,所以下面是我得到的一個函數

def myfunction_a(request):

    os.getcwd()  # Should get this Django project root (where manage.py is)
    fn = os.path.abspath(os.path.join(os.getcwd(),'app/data/mydata_a.csv'))
    # TODO: Move to helper module
    response_data = {}
    data_format = 'tsv'
    if data_format == 'json':
        with open(fn, 'rb') as tsvin:
            tsvin = csv.reader(tsvin, delimiter='\t')

            for row in tsvin:
                print 'col1 = %s  col2 = %s' % (row[0], row[1])
                response_data[row[0]] = row[1]
        result = HttpResponse(json.dumps(response_data), content_type = 'application/json')
    else:
        with open(fn, 'rb') as tsvin:
            buff = tsvin.read()
        result = HttpResponse(buff, content_type = 'text/tsv')
    return result

我希望能夠遍歷列表並創建多個函數名稱:

mylist = ['a','b','c' ... 'z' ]

def myfunction_a(request):...('app / data / mydata_a.csv')返回請求

得到最終結果:

  • def myfunction_a =>使用“ app / data / mydata_a.csv”
  • def myfunction_b =>使用“ app / data / mydata_b.csv”
  • def myfunction_c =>接受'app / data / mydata_c.csv'

現在,我只是復制和更改它。 有更好的辦法嗎? 任何建議,將不勝感激。 謝謝。

您可以使用以下命令向字符串添加變量

"app/data/mydata_%s.csv" % (character)

所以

for character in mylist:
    print "app/data/mydata_%s.csv" % (character)

每次都應在%s處附加另一個字符

因此,由於您要為每個函數使用另一個字符串來獲取另一個文件,因此可以執行以下操作:

def myfunction(label, request):
    return "app/data/mydata_%s.csv" % (label) 

因此您可以在文檔路徑的末尾獲得功能標簽。 由於您描述了您只想更改名稱以使其等於功能標簽,因此您只需要另一個參數,而不需要新的功能名稱

如果必須具有特殊的函數名稱,則可以執行此操作。 雖然我不確定為什么需要。

import functools, sys
namespace = sys._getframe(0).f_globals

def myfunction(label, request):
    print request
    return "app/data/mydata_%s.csv" % (label)

my_labels = ['a','b','c']
for label in my_labels:
    namespace['myfunction_%s'%label] = functools.partial(myfunction, label)

print myfunction_a('request1')
print myfunction_b('request2')

輸出是這樣的:

request1
app/data/mydata_a.csv
request2
app/data/mydata_b.csv

也許更好的實現是:

class MyClass(object):
    def __init__(self, labels):
        for label in labels:
            setattr(self, label, functools.partial(self._myfunction, label))
    def _myfunction(self, label, request):
        print request
        return "app/data/mydata_%s.csv" % (label)

myfunction = MyClass(['a','b','c'])
print myfunction.c('request3')

輸出是這樣的:

request3
app/data/mydata_c.csv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM