2016-03-18 11 views
0

良いアイデアであろうとなかろうと、メソッドはある入力を受け入れるように強制することが可能かどうかを知りたいと思っていました。例えば、引用符なしの文字( "!")です。例:特定の入力を受け入れるようにPythonの関数を強制するには?

def special_print(text): 
    """Print <text> unless ! (no quotes!) is passed as argument.""" 
    if text == !: 
     print("Easter egg!") 
    else: 
     print(text) 


special_print("Hello, World"!) 
>>> Hello, World! 

special_print("!") 
>>> ! 

special_print(!) 
>>> Easter egg! 

これは可能でしょうか?ちょっと興味があるんだけど。

+2

独自の構文でPythonをフォークしない限り、そうではありません。 – TigerhawkT3

答えて

1

独自のPythonソースをビルドしない限り、これは不可能です。

唯一の例外は...で、これはPython 3(Python 2ではなく)のEllipsisオブジェクトに相当します。だから、あなたができる:

def special_print(text): 
    """Print <text> unless ... (no quotes!) is passed as argument.""" 
    if text == ...: 
     print("Easter egg!") 
    else: 
     print(text) 

...は、スライスで使用するように設計されていますが、Pythonの3のようあなたはどこでもそれを使用することができます。

1

これはあなたが記述した方法では不可能ですが、私はあなたが対話的なシェルでこの種の構文を使いたいと思っています。そうでなければ、これがどのように役立つのか想像もできません。この場合、cmdモジュールを使用して独自のシェルを作成することができます。例:あなたは一種の回り道で別の質問を求めている

(Cmd) print ! 
! 
(Cmd) print anything you want 
anything you want 
(Cmd) exit 
1

次のように動作するシェルを起動します。このコードの

import cmd 

class SpecialPrint(cmd.Cmd): 

    def do_print(self, line): 
     print line 

    def do_exit(self, line): 
     return True 

if __name__ == '__main__': 
    SpecialPrint().cmdloop() 

実行中。 Pythonは動的に型付けされているので、関数は任意の型を受け入れます。おそらくSentinelオブジェクトを使用して、他のタイプを使用したいものと似たようなことをすることができます。

Sentinel = object() 

def special_print(text): 
    if text is Sentinel: 
     print("Easter egg!") 
    else: 
     print(text) 

special_print(Sentinel) 

有効な変数名ではないため、!文字を使用することはできません。 Sentinelオブジェクトを使用する必要はありません。文字列以外の変数を使用してください。

def special_print(text): 
    if isinstance(text, int): 
     print("Easter egg!") 
    else: 
     print(text) 

special_print(1) 
関連する問題