2016-06-07 64 views
3

我想用一個@decorator,讓我能夠訪問' - '.join(args)args,如下式所示。這是可能的,也許使用元類?如何使用一個裝飾修改* args來類型?

def a(*args): 
    print(args) 
a(1, 2, 3) 
# (1, 2, 3) 

@magic 
def b(*args): 
    print(args) 
b(1, 2, 3) 
# 1 - 2 - 3 

回答

2

你可以親近:

def magic(func): 
    def wrapper(*args): 
     return func(' - '.join(map(str, args))) 
    return wrapper 

但這打印出('1 - 2 - 3',)因爲b體內認爲args如因*args一個元組,我懷疑一個裝飾可以得到解決的。如果身體像print(args[1])那樣,你預計會發生什麼?

+0

這就是我想要的,但對於我來說重要的部分是解決'args'是一個元組。是否有可能使用元類來改變這個功能? – 2Cubed

+0

身體不要通常指數'args' - 它會希望它是一個字符串。 (但是,如果它的確如此,'args [1]'會返回字符串中的第二個字符。) – 2Cubed

+0

這不是你的第一個問題,你需要尋找一些非常奇怪的東西。這很可能會導致錯誤和混亂的代碼。你爲什麼想這樣做? –

0

所以問題的一部分是,你使用,你需要字符串整數,因此將它們轉換成字符串,然後使用該連接功能。

def magic(func): 
    def wrapper(*args): 
     return ' - '.join(map(str, args)) 
    return wrapper 

@magic 
def a(*args): 
    return 'Arguments were {}.'.format(args) 

print(a(1, 2, 3)) 
+0

雖然這確實有效,但這不是我要求的。我想在裝飾器中使用這個功能,然後在函數本身中將'args'作爲字符串'「1 - 2 - 3」'(而不是元組)訪問。 – 2Cubed

+0

我更新了它以符合您的要求。 – whybull

+0

這確實有用,但它實際上從未執行過'a'。輸出顯示「1 - 2 - 3」,但它從不顯示「參數爲1 - 2 - 3」。在'magic'裝飾器聲明中,'func()'永遠不會被調用。 – 2Cubed

相關問題